Bleak Faith: Forsaken Wiki bleakfaith_en https://bleakfaith.wiki.gg/ MediaWiki 1.43.3 first-letter Media Special Talk User User talk Meta Meta talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Module Module talk Map Map talk Template:Error 10 335 437 2013-10-29T00:20:58Z wikipedia>Mr. Stradivarius 0 Protected Template:Error: [[WP:High-risk templates|Highly visible template]]: 32,000 transclusions ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)) wikitext text/x-wiki {{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude> {{documentation}} </noinclude> 5da54c14258c1b1755a03bccb88dc5d9d0cefb56 Module:Namespace detect 828 329 425 2014-04-05T17:01:23Z wikipedia>Mr. Stradivarius 0 use demopage instead of page as the main "page" parameter Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p a4757000273064f151f0f22dc0e139092e5ff443 Module:Error 828 334 435 2016-11-21T11:11:11Z wikipedia>Materialscientist 0 Changed protection level for "[[Module:Error]]": [[WP:High-risk templates|Highly visible template]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) Scribunto text/plain -- This module implements {{error}}. local p = {} local function _error(args) local tag = mw.ustring.lower(tostring(args.tag)) -- Work out what html tag we should use. if not (tag == 'p' or tag == 'span' or tag == 'div') then tag = 'strong' end -- Generate the html. return tostring(mw.html.create(tag) :addClass('error') :wikitext(tostring(args.message or args[1] or error('no message specified', 2))) ) end function p.error(frame) local args if type(frame.args) == 'table' then -- We're being called via #invoke. The args are passed through to the module -- from the template page, so use the args that were passed into the template. args = frame.args else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame end -- if the message parameter is present but blank, change it to nil so that Lua will -- consider it false. if args.message == "" then args.message = nil end return _error(args) end return p f77bd720c216b5626efe795d3b49462d50971f7d Module:Namespace detect/config 828 330 427 2020-04-01T06:12:44Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/data 828 331 429 2020-04-01T06:12:45Z wikipedia>MusikAnimal 0 1 revision imported Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:About 828 339 445 2020-07-14T13:59:23Z wikipedia>Nihiltres 0 Removed defaultOptions.namespace as redundant, per request on talk by Andrybak Scribunto text/plain local mArguments --initialize lazily local mHatnote = require('Module:Hatnote') local mHatList = require('Module:Hatnote list') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.about (frame) -- A passthrough that gets args from the frame and all mArguments = require('Module:Arguments') args = mArguments.getArgs(frame) return p._about(args) end function p._about (args, options) -- Produces "about" hatnote. -- Type checks and defaults checkType('_about', 1, args, 'table', true) args = args or {} checkType('_about', 2, options, 'table', true) options = options or {} local defaultOptions = { aboutForm = 'This %s is about %s. ', PageType = require('Module:Pagetype').main(), otherText = nil, --included for complete list sectionString = 'section' } for k, v in pairs(defaultOptions) do if options[k] == nil then options[k] = v end end -- Set initial "about" string local pageType = (args.section and options.sectionString) or options.PageType local about = '' if args[1] then about = string.format(options.aboutForm, pageType, args[1]) end --Allow passing through certain options local fsOptions = { otherText = options.otherText, extratext = args.text } local hnOptions = { selfref = args.selfref } -- Set for-see list local forSee = mHatList._forSee(args, 2, fsOptions) -- Concatenate and return return mHatnote._hatnote(about .. forSee, hnOptions) end return p 1abb25315b25b63b97d98ecae17733cbea8fcc6a Module:Convert/wikidata 828 723 1109 2021-05-06T05:08:27Z wikipedia>Johnuniq 0 update from sandbox per [[Template talk:Convert#Module version 25]] Scribunto text/plain -- Functions to access Wikidata for Module:Convert. local Collection = {} Collection.__index = Collection do function Collection:add(item) if item ~= nil then self.n = self.n + 1 self[self.n] = item end end function Collection:join(sep) return table.concat(self, sep) end function Collection:remove(pos) if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then self.n = self.n - 1 return table.remove(self, pos) end end function Collection:sort(comp) table.sort(self, comp) end function Collection.new() return setmetatable({n = 0}, Collection) end end local function strip_to_nil(text) -- If text is a non-empty string, return its trimmed content, -- otherwise return nothing (empty string or not a string). if type(text) == 'string' then return text:match('(%S.-)%s*$') end end local function frequency_unit(value, unit_table) -- For use when converting m to Hz. -- Return true, s where s = name of unit's default output unit, -- or return false, t where t is an error message table. -- However, for simplicity a valid result is always returned. local unit if unit_table._symbol == 'm' then -- c = speed of light in a vacuum = 299792458 m/s -- frequency = c / wavelength local w = value * (unit_table.scale or 1) local f = 299792458 / w -- if w == 0, f = math.huge which works here if f >= 1e12 then unit = 'THz' elseif f >= 1e9 then unit = 'GHz' elseif f >= 1e6 then unit = 'MHz' elseif f >= 1e3 then unit = 'kHz' else unit = 'Hz' end end return true, unit or 'Hz' end local function wavelength_unit(value, unit_table) -- Like frequency_unit but for use when converting Hz to m. local unit if unit_table._symbol == 'Hz' then -- Using 0.9993 rather than 1 avoids rounding which would give results -- like converting 300 MHz to 100 cm instead of 1 m. local w = 1 / (value * (unit_table.scale or 1)) -- Hz scale is inverted if w >= 0.9993e6 then unit = 'Mm' elseif w >= 0.9993e3 then unit = 'km' elseif w >= 0.9993 then unit = 'm' elseif w >= 0.9993e-2 then unit = 'cm' elseif w >= 0.9993e-3 then unit = 'mm' else unit = 'um' end end return true, unit or 'm' end local specials = { frequency = { frequency_unit }, wavelength = { wavelength_unit }, -------------------------------------------------------------------------------- -- Following is a removed experiment to show two values as a range -- using '-' as the separator. -- frequencyrange = { frequency_unit, '-' }, -- wavelengthrange = { wavelength_unit, '-' }, } local function make_unit(units, parms, uid) -- Return a unit code for convert or nil if unit unknown. -- If necessary, add a dummy unit to parms so convert will use it -- for the input without attempting a conversion since nothing -- useful is available (for example, with unit volt). local unit = units[uid] if type(unit) ~= 'table' then return nil end local ucode = unit.ucode if ucode and not unit.si then return ucode -- a unit known to convert end parms.opt_ignore_error = true ucode = ucode or unit._ucode -- must be a non-empty string local ukey, utable if unit.si then local base = units[unit.si] ukey = base.symbol -- must be a non-empty string local n1 = base.name1 local n2 = base.name2 if not n1 then n1 = ukey n2 = n2 or n1 -- do not append 's' end utable = { _symbol = ukey, _name1 = n1, _name2 = n2, link = unit.link or base.link, utype = n1, prefixes = 1, } else ukey = ucode utable = { symbol = ucode, -- must be a non-empty string name1 = unit.name1, -- if nil, uses symbol name2 = unit.name2, -- if nil, uses name1..'s' link = unit.link, -- if nil, uses name1 utype = unit.name1 or ucode, } end utable.scale = 1 utable.default = '' utable.defkey = '' utable.linkey = '' utable.bad_mcode = '' parms.unittable = { [ukey] = utable } return ucode end local function matches_qualifier(statement, qual) -- Return: -- false, nil : if statement does not match specification -- true, nil : if matches, and statement has no qualifier -- true, sq : if matches, where sq is the statement's qualifier -- A match means that no qualifier was specified (qual == nil), or that -- the statement has a qualifier matching the specification. -- If a match occurs, the caller needs the statement's qualifier (if any) -- so statements that duplicate the qualifier are not used, after the first. -- Then, if convert is showing all values for a property such as the diameter -- of a telescope's mirror (diameters of primary and secondary mirrors), it -- will not show alternative values that could in principle be present for the -- same item (telescope) and property (diameter) and qualifier (primary/secondary). local target = (statement.qualifiers or {}).P518 -- P518 is "applies to part" if type(target) == 'table' then for _, q in ipairs(target) do if type(q) == 'table' then local value = (q.datavalue or {}).value if value then if qual == nil or qual == value.id then return true, value.id end end end end end if qual == nil then return true, nil -- only occurs if statement has no qualifier end return false, nil -- statement's qualifier is not relevant because statement will be skipped end local function get_statements(parms, pid) -- Get specified item and return a list of tables with each statement for property pid. -- Each table is of form {statqual=sq, stmt=statement} where sq = statement qualifier (nil if none). -- Statements are in Wikidata's order except that those with preferred rank -- are first, then normal rank. Any other rank is ignored. local stored = {} -- qualifiers of statements that are first for the qualifier, and will be returned local qid = strip_to_nil(parms.qid) -- nil for current page's item, or an item id (expensive) local qual = strip_to_nil(parms.qual) -- nil or id of wanted P518 (applies to part) item in qualifiers local result = Collection.new() local entity = mw.wikibase.getEntity(qid) if type(entity) == 'table' then local statements = (entity.claims or {})[pid] if type(statements) == 'table' then for _, rank in ipairs({ 'preferred', 'normal' }) do for _, statement in ipairs(statements) do if type(statement) == 'table' and rank == statement.rank then local is_match, statqual = matches_qualifier(statement, qual) if is_match then result:add({ statqual = statqual, stmt = statement }) end end end end end end return result end local function input_from_property(tdata, parms, pid) -- Given that pid is a Wikidata property identifier like 'P123', -- return a collection of {amount, ucode} pairs (two strings) -- for each matching item/property, or return nothing. -------------------------------------------------------------------------------- -- There appear to be few restrictions on how Wikidata is organized so it is -- very likely that any decision a module makes about how to handle data -- will be wrong for some cases at some time. This meets current requirements. -- For each qualifier (or if no qualifier), if there are any preferred -- statements, use them and ignore any normal statements. -- For each qualifier, for the preferred statements if any, or for -- the normal statements (but not both): -- * Accept each statement if it has no qualifier (this will not occur -- if qual=x is specified because other code already ensures that in that -- case, only statements with a qualifier matching x are considered). -- * Ignore any statements after the first if it has a qualifier. -- The rationale is that for the diameter at [[South Pole Telescope]], want -- convert to show the diameters for both the primary and secondary mirrors -- if the convert does not specify which diameter is wanted. -- However, if convert is given the wanted qualifier, only one value -- (_the_ diameter) is wanted. For simplicity/consistency, that is also done -- even if no qual=x is specified. Unclear what should happen. -- For the wavelength at [[Nançay Radio Telescope]], want to show all three -- values, and the values have no qualifiers. -------------------------------------------------------------------------------- local result = Collection.new() local done = {} local skip_normal for _, t in ipairs(get_statements(parms, pid)) do local statement = t.stmt if statement.mainsnak and statement.mainsnak.datatype == 'quantity' then local value = (statement.mainsnak.datavalue or {}).value if value then local amount = value.amount if amount then amount = tostring(amount) -- in case amount is ever a number if amount:sub(1, 1) == '+' then amount = amount:sub(2) end local unit = value.unit if type(unit) == 'string' then unit = unit:match('Q%d+$') -- unit item id is at end of URL local ucode = make_unit(tdata.wikidata_units, parms, unit) if ucode then local skip if t.statqual then if done[t.statqual] then skip = true else done[t.statqual] = true end else if statement.rank == 'preferred' then skip_normal = true elseif skip_normal then skip = true end end if not skip then result:add({ amount, ucode }) end end end end end end end return result end local function input_from_text(tdata, parms, text, insert2) -- Given string should be of form "<value><space><unit>" or -- "<value1><space>ft<space><value2><space>in" for a special case (feet and inches). -- Return true if values/units were extracted and inserted, or return nothing. text = text:gsub('&nbsp;', ' '):gsub('%s+', ' ') local pos = text:find(' ', 1, true) if pos then -- Leave checking of value to convert which can handle fractions. local value = text:sub(1, pos - 1) local uid = text:sub(pos + 1) if uid:sub(1, 3) == 'ft ' and uid:sub(-3) == ' in' then -- Special case for enwiki to allow {{convert|input=5 ft 10+1/2 in}} insert2(uid:sub(4, -4), 'in') insert2(value, 'ft') else insert2(value, make_unit(tdata.wikidata_units, parms, uid) or uid) end return true end end local function adjustparameters(tdata, parms, index) -- For Module:Convert, adjust parms (a table of {{convert}} parameters). -- Return true if successful or return false, t where t is an error message table. -- This is intended mainly for use in infoboxes where the input might be -- <value><space><unit> or -- <wikidata-property-id> -- If successful, insert values and units in parms, before given index. local text = parms.input -- should be a trimmed, non-empty string local pid = text:match('^P%d+$') local sep = ',' local special = specials[parms[index]] if special then parms.out_unit = special[1] sep = special[2] or sep table.remove(parms, index) end local function quit() return false, pid and { 'cvt_no_output' } or { 'cvt_bad_input', text } end local function insert2(first, second) table.insert(parms, index, second) table.insert(parms, index, first) end if pid then parms.input_text = '' -- output an empty string if an error occurs local result = input_from_property(tdata, parms, pid) if result.n == 0 then return quit() end local ucode for i, t in ipairs(result) do -- Convert requires each input unit to be identical. if i == 1 then ucode = t[2] elseif ucode ~= t[2] then return quit() end end local item = ucode if item == parms[index] then -- Remove specified output unit if it is the same as the Wikidata unit. -- For example, {{convert|input=P2044|km}} with property "12 km". table.remove(parms, index) end for i = result.n, 1, -1 do insert2(result[i][1], item) item = sep end return true else if input_from_text(tdata, parms, text, insert2) then return true end end return quit() end -------------------------------------------------------------------------------- --- List units and check syntax of definitions --------------------------------- -------------------------------------------------------------------------------- local specifications = { -- seq = sequence in which fields are displayed base = { title = 'SI base units', fields = { symbol = { seq = 2, mandatory = true }, name1 = { seq = 3, mandatory = true }, name2 = { seq = 4 }, link = { seq = 5 }, }, noteseq = 6, header = '{| class="wikitable"\n!si !!symbol !!name1 !!name2 !!link !!note', item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s', footer = '|}', }, alias = { title = 'Aliases for convert', fields = { ucode = { seq = 2, mandatory = true }, si = { seq = 3 }, }, noteseq = 4, header = '{| class="wikitable"\n!alias !!ucode !!base !!note', item = '|-\n|%s ||%s ||%s ||%s', footer = '|}', }, known = { title = 'Units known to convert', fields = { ucode = { seq = 2, mandatory = true }, label = { seq = 3, mandatory = true }, }, noteseq = 4, header = '{| class="wikitable"\n!qid !!ucode !!label !!note', item = '|-\n|%s ||%s ||%s ||%s', footer = '|}', }, unknown = { title = 'Units not known to convert', fields = { _ucode = { seq = 2, mandatory = true }, si = { seq = 3 }, name1 = { seq = 4 }, name2 = { seq = 5 }, link = { seq = 6 }, label = { seq = 7, mandatory = true }, }, noteseq = 8, header = '{| class="wikitable"\n!qid !!_ucode !!base !!name1 !!name2 !!link !!label !!note', item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s ||%s ||%s', footer = '|}', }, } local function listunits(tdata, ulookup) -- For Module:Convert, make wikitext to list the built-in Wikidata units. -- Return true, wikitext if successful or return false, t where t is an -- error message table. Currently, an error return never occurs. -- The syntax of each unit definition is checked and a note is added if -- a problem is detected. local function safe_cells(t) -- This is not currently needed, but in case definitions ever use wikitext -- like '[[kilogram|kg]]', escape the text so it works in a table cell. local result = {} for i, v in ipairs(t) do if v:find('|', 1, true) then v = v:gsub('(%[%[[^%[%]]-)|(.-%]%])', '%1\0%2') -- replace pipe in piped link with a zero byte v = v:gsub('|', '&#124;') -- escape '|' v = v:gsub('%z', '|') -- restore pipe in piped link end result[i] = v:gsub('{', '&#123;') -- escape '{' end return unpack(result) end local wdunits = tdata.wikidata_units local speckeys = { 'base', 'alias', 'unknown', 'known' } for _, sid in ipairs(speckeys) do specifications[sid].units = Collection.new() end local keys = Collection.new() for k, v in pairs(wdunits) do keys:add(k) end table.sort(keys) local note_count = 0 for _, key in ipairs(keys) do local unit = wdunits[key] local ktext, sid if key:match('^Q%d+$') then ktext = '[[d:' .. key .. '|' .. key .. ']]' if unit.ucode then sid = 'known' else sid = 'unknown' end elseif unit.ucode then ktext = key sid = 'alias' else ktext = key sid = 'base' end local result = { ktext } local spec = specifications[sid] local fields = spec.fields local note = Collection.new() for k, v in pairs(unit) do if fields[k] then local seq = fields[k].seq if result[seq] then note:add('duplicate ' .. k) -- cannot happen since keys are unique else result[seq] = v end else note:add('invalid ' .. k) end end for k, v in pairs(fields) do local value = result[v.seq] if value then if k == 'si' and not wdunits[value] then note:add('need si ' .. value) end if k == 'label' then local wdl = mw.wikibase.getLabel(key) if wdl ~= value then note:add('label changed to ' .. tostring(wdl)) end end else result[v.seq] = '' if v.mandatory then note:add('missing ' .. k) end end end local text if note.n > 0 then note_count = note_count + 1 text = '*' .. note:join('<br />') end result[spec.noteseq] = text or '' spec.units:add(result) end local results = Collection.new() if note_count > 0 then local text = note_count .. (note_count == 1 and ' note' or ' notes') results:add("'''Search for * to see " .. text .. "'''\n") end for _, sid in ipairs(speckeys) do local spec = specifications[sid] results:add("'''" .. spec.title .. "'''") results:add(spec.header) local fmt = spec.item for _, unit in ipairs(spec.units) do results:add(string.format(fmt, safe_cells(unit))) end results:add(spec.footer) end return true, results:join('\n') end return { _adjustparameters = adjustparameters, _listunits = listunits } b93954acaa7b2c734c1c6f4c869ed6d1821a2d84 Module:Convert/wikidata/data 828 724 1111 2021-06-06T03:21:16Z wikipedia>Johnuniq 0 update from sandbox per [[Template talk:Convert#Module version 26]] Scribunto text/plain --[[ Cache of Wikidata information with units for Module:Convert. The codes should rarely change, and using a cache means that changing a unit at Wikidata will not cause lots of converts in articles to break. For a unit known to convert, the unit here must have: label = Wikidata label for unit (used only when listing units) ucode = unit code for input to convert (there are no optional fields because convert handles everything) For a unit not known to convert, the unit here must have: label = Wikidata label for unit (used only when listing units) (no ucode field) _ucode = unit code for input to convert, and the symbol used to display the unit when abbr=on (convert will use the specified fields to display the unit, and will not attempt to do a conversion) For a unit not known to convert, the unit here may have: name1 = singular name used to display the unit when abbr=off name2 = plural name used to display the unit when abbr=off link = name of article that unit will be linked to when lk=on si = key for the SI base unit, if any The base unit for each SI unit here must have: symbol = symbol used to display the base unit when abbr=on name1 = singular name of base unit used to display the unit when abbr=off (if name1 is not given, symbol will be used, but an SI unit should have a name) The base unit for each SI unit here may have: name2 = plural name of base unit used to display the unit when abbr=off link = name of article that unit will be linked to when lk=on (applies for all SI units using this base, where the SI unit does not define its own link field) If name1 is not specified, the symbol is used for the name. If name2 is not specified, a plural name is formed by appending 's' to name1. If link is not specified, name1 is used for the link. SI units are assumed to be simple items like V (volt) where 'mV' would cause convert to insert: 'm' before the base symbol 'V' to make 'mV', if abbr=on 'milli' before the base name 'volt' to make 'millivolt', if abbr=off A unit like "square meter" would not work because it needs an SI prefix inserted before "meter" rather than at the beginning of the name. Items that should not be used with convert as no precise unit is implied: Q11247037 ton generic (cannot use) Q178413 gallon generic Q130964 calorie dubious (ambiguous, should not use) Q216658 bushel dubious Q420266 fluid ounce dubious ]] local wikidata_units = { -- Following are SI base units. A = { symbol = 'A', name1 = 'ampere', }, F = { symbol = 'F', name1 = 'faraday', }, H = { symbol = 'H', name1 = 'henry', }, V = { symbol = 'V', name1 = 'volt', }, -- Following are aliases to convert unit codes, used with "input=<value><space><unit>". kilograms = { ucode = 'kg', }, -- Following are SI units not known to convert, used with "input=<value><space><unit>". kV = { ucode = 'kV', si = 'V', }, mV = { ucode = 'mV', si = 'V', }, -- Following are Wikidata units. Q131255 = { label = 'farad', _ucode = 'F', si = 'F', }, Q163354 = { label = 'henry', _ucode = 'H', si = 'H', }, Q1916026 = { label = 'microvolt', _ucode = 'uV', si = 'V', }, Q193933 = { label = 'dioptre', name1 = 'dioptre', _ucode = 'dpt', }, Q212120 = { label = 'ampere hour', name1 = 'ampere hour', _ucode = 'A⋅h', }, Q2448803 = { label = 'millivolt', _ucode = 'mV', si = 'V', }, Q2451296 = { label = 'microfarad', _ucode = 'uF', si = 'F', }, Q2490574 = { label = 'milliampere', _ucode = 'mA', si = 'A', }, Q25250 = { label = 'volt', _ucode = 'V', si = 'V', }, Q25272 = { label = 'ampere', _ucode = 'A', si = 'A', }, Q2553708 = { label = 'megavolt', _ucode = 'MV', si = 'V', }, Q2554092 = { label = 'kilovolt', _ucode = 'kV', si = 'V', }, Q2636421 = { label = 'nanohenry', _ucode = 'nH', si = 'H', }, Q2679083 = { label = 'microhenry', _ucode = 'uH', si = 'H', }, Q2682463 = { label = 'nanofarad', _ucode = 'nF', si = 'F', }, Q2756030 = { label = 'picofarad', _ucode = 'pF', si = 'F', }, Q2793566 = { label = 'gigavolt', _ucode = 'GV', si = 'V', }, Q2924137 = { label = 'millihenry', _ucode = 'mH', si = 'H', }, Q3117809 = { label = 'microampere', _ucode = 'uA', si = 'A', }, Q33680 = { label = 'radian', name1 = 'radian', _ucode = 'rad', }, Q4456994 = { label = 'millifarad', _ucode = 'mF', si = 'F', }, Q47083 = { label = 'ohm', name1 = 'ohm', _ucode = 'Ω', }, Q483261 = { label = 'dalton', name1 = 'dalton', _ucode = 'u', }, Q550341 = { label = 'volt-ampere', name1 = 'volt-ampere', _ucode = 'VA', }, Q100995 = { label = 'pound', ucode = 'lb', }, Q1022113 = { label = 'cubic centimetre', ucode = 'cc', }, Q102573 = { label = 'becquerel', ucode = 'Bq', }, Q103246 = { label = 'sievert', ucode = 'Sv', }, Q1050958 = { label = 'inch of mercury', ucode = 'inHg', }, Q1051665 = { label = 'metre per second squared', ucode = 'm/s2', }, Q1052397 = { label = 'rad', ucode = 'rad', }, Q1054140 = { label = 'megametre', ucode = 'Mm', }, Q1057069 = { label = 'hectogram', ucode = 'hg', }, Q1063786 = { label = 'square inch', ucode = 'sqin', }, Q1092296 = { label = 'annum', ucode = 'year', }, Q11570 = { label = 'kilogram', ucode = 'kg', }, Q11573 = { label = 'metre', ucode = 'm', }, Q11574 = { label = 'second', ucode = 's', }, Q11579 = { label = 'kelvin', ucode = 'K', }, Q11582 = { label = 'litre', ucode = 'litre', }, Q1165588 = { label = 'rod', ucode = 'rod', }, Q1165799 = { label = 'thou', ucode = 'thou', }, Q11776930 = { label = 'megagram', ucode = 'Mg', }, Q11929860 = { label = 'kiloparsec', ucode = 'kpc', }, Q1194225 = { label = 'pound-force', ucode = 'lbf', }, Q12129 = { label = 'parsec', ucode = 'pc', }, Q12438 = { label = 'newton', ucode = 'N', }, Q1255620 = { label = 'dram', ucode = 'drachm', }, Q12874593 = { label = 'watt-hour', ucode = 'W.h', }, Q128822 = { label = 'knot', ucode = 'kn', }, Q1374438 = { label = 'kilosecond', ucode = 'ks', }, Q1377051 = { label = 'gigasecond', ucode = 'Gs', }, Q14754979 = { label = 'zettagram', ucode = 'Zg', }, Q14786969 = { label = 'megajoule', ucode = 'MJ', }, Q14787261 = { label = 'megawatt hour', ucode = 'MW.h', }, Q1550511 = { label = 'square yard', ucode = 'sqyd', }, Q160857 = { label = 'metric horsepower', ucode = 'hp', }, Q1628990 = { label = 'horsepower-hour', ucode = 'hph', }, Q163343 = { label = 'tesla', ucode = 'T', }, Q1645498 = { label = 'microgram', ucode = 'ug', }, Q17087835 = { label = 'cuerda', ucode = 'cda', }, Q174728 = { label = 'centimetre', ucode = 'cm', }, Q174789 = { label = 'millimetre', ucode = 'mm', }, Q175821 = { label = 'micrometre', ucode = 'um', }, Q1770733 = { label = 'teragram', ucode = 'Tg', }, Q1772386 = { label = 'decigram', ucode = 'dg', }, Q177493 = { label = 'gauss', ucode = 'G', }, Q1777507 = { label = 'femtosecond', ucode = 'fs', }, Q177974 = { label = 'standard atmosphere', ucode = 'atm', }, Q178674 = { label = 'nanometre', ucode = 'nm', }, Q180154 = { label = 'kilometre per hour', ucode = 'km/h', }, Q180892 = { label = 'solar mass', ucode = 'solar mass', }, Q1811 = { label = 'astronomical unit', ucode = 'au', }, Q1815100 = { label = 'centilitre', ucode = 'cl', }, Q182098 = { label = 'kilowatt hour', ucode = 'kW.h', }, Q1823150 = { label = 'microwatt', ucode = 'uW', }, Q182429 = { label = 'metre per second', ucode = 'm/s', }, Q1826195 = { label = 'decilitre', ucode = 'dl', }, Q185078 = { label = 'are', ucode = 'a', }, Q185153 = { label = 'erg', ucode = 'erg', }, Q185648 = { label = 'torr', ucode = 'Torr', }, Q190095 = { label = 'gray', ucode = 'Gy', }, Q191118 = { label = 'tonne', ucode = 'tonne', }, Q1913097 = { label = 'femtogram', ucode = 'fg', }, Q192274 = { label = 'picometre', ucode = 'pm', }, Q1972579 = { label = 'poundal', ucode = 'pdl', }, Q200323 = { label = 'decimetre', ucode = 'dm', }, Q201933 = { label = 'dyne', ucode = 'dyn', }, Q2029519 = { label = 'hectolitre', ucode = 'hl', }, Q2051195 = { label = 'gigawatt hour', ucode = 'GW.h', }, Q207488 = { label = 'Rankine scale', ucode = 'R', }, Q208788 = { label = 'femtometre', ucode = 'fm', }, Q2101 = { label = 'elementary charge', ucode = 'e', }, Q21014455 = { label = 'metre per minute', ucode = 'm/min', }, Q21062777 = { label = 'megapascal', ucode = 'MPa', }, Q21064807 = { label = 'kilopascal', ucode = 'kPa', }, Q211256 = { label = 'mile per hour', ucode = 'mph', }, Q21178489 = { label = 'barrels per day', ucode = 'oilbbl/d', }, Q2143992 = { label = 'kilohertz', ucode = 'kHz', }, Q21467992 = { label = 'cubic foot per second', ucode = 'cuft/s', }, Q215571 = { label = 'newton metre', ucode = 'Nm', }, Q216795 = { label = 'dunam', ucode = 'dunam', }, Q216880 = { label = 'kilogram-force', ucode = 'kgf', }, Q18413919 = { label = 'centimetre per second', ucode = 'cm/s', }, Q218593 = { label = 'inch', ucode = 'in', }, Q2282891 = { label = 'microlitre', ucode = 'ul', }, Q2282906 = { label = 'nanogram', ucode = 'ng', }, Q229354 = { label = 'curie', ucode = 'Ci', }, Q232291 = { label = 'square mile', ucode = 'sqmi', }, Q2332346 = { label = 'millilitre', ucode = 'ml', }, Q23387 = { label = 'week', ucode = 'week', }, Q23823681 = { label = 'terawatt', ucode = 'TW', }, Q23925410 = { label = 'gallon (UK)', ucode = 'impgal', }, Q23925413 = { label = 'gallon (US)', ucode = 'USgal', }, Q2438073 = { label = 'attogram', ucode = 'ag', }, Q2474258 = { label = 'millisievert', ucode = 'mSv', }, Q2483628 = { label = 'attosecond', ucode = 'as', }, Q2489298 = { label = 'square centimetre', ucode = 'cm2', }, Q2518569 = { label = 'nanosievert', ucode = 'nSv', }, Q25235 = { label = 'hour', ucode = 'h', }, Q25236 = { label = 'watt', ucode = 'W', }, Q25267 = { label = 'degree Celsius', ucode = 'C', }, Q25269 = { label = 'joule', ucode = 'J', }, Q253276 = { label = 'mile', ucode = 'mi', }, Q25343 = { label = 'square metre', ucode = 'm2', }, Q25406 = { label = 'coulomb', ucode = 'coulomb', }, Q25517 = { label = 'cubic metre', ucode = 'm3', }, Q260126 = { label = 'Roentgen equivalent man', ucode = 'rem', }, Q2612219 = { label = 'petagram', ucode = 'Pg', }, Q2619500 = { label = 'foe', ucode = 'foe', }, Q2637946 = { label = 'decalitre', ucode = 'dal', }, Q2655272 = { label = 'exagram', ucode = 'Eg', }, Q2691798 = { label = 'centigram', ucode = 'cg', }, Q2739114 = { label = 'microsievert', ucode = 'uSv', }, Q2799294 = { label = 'gigagram', ucode = 'Gg', }, Q3013059 = { label = 'kiloannum', ucode = 'millennium', }, Q305896 = { label = 'dots per inch', ucode = 'dpi', }, Q3207456 = { label = 'milliwatt', ucode = 'mW', }, Q3221356 = { label = 'yoctometre', ucode = 'ym', }, Q3239557 = { label = 'picogram', ucode = 'pg', }, Q3241121 = { label = 'milligram', ucode = 'mg', }, Q3267417 = { label = 'terametre', ucode = 'Tm', }, Q3270676 = { label = 'zeptometre', ucode = 'zm', }, Q3276763 = { label = 'gigahertz', ucode = 'GHz', }, Q3277907 = { label = 'exametre', ucode = 'Em', }, Q3277915 = { label = 'zettametre', ucode = 'Zm', }, Q3277919 = { label = 'petametre', ucode = 'Pm', }, Q3312063 = { label = 'femtolitre', ucode = 'fl', }, Q3320608 = { label = 'kilowatt', ucode = 'kW', }, Q3332822 = { label = 'megaton of TNT', ucode = 'Mt(TNT)', }, Q35852 = { label = 'hectare', ucode = 'ha', }, Q3675550 = { label = 'cubic millimetre', ucode = 'mm3', }, Q3710 = { label = 'foot', ucode = 'ft', }, Q3773454 = { label = 'megaparsec', ucode = 'Mpc', }, Q3902688 = { label = 'picolitre', ucode = 'pl', }, Q3902709 = { label = 'picosecond', ucode = 'ps', }, Q39369 = { label = 'hertz', ucode = 'Hz', }, Q3972226 = { label = 'kilolitre', ucode = 'kl', }, Q4068266 = { label = "apothecaries' drachm", ucode = 'drachm', }, Q41803 = { label = 'gram', ucode = 'g', }, Q4220561 = { label = 'kilometre per second', ucode = 'km/s', }, Q42289 = { label = 'degree Fahrenheit', ucode = 'F', }, Q4243638 = { label = 'cubic kilometre', ucode = 'km3', }, Q44395 = { label = 'pascal', ucode = 'Pa', }, Q48013 = { label = 'ounce', ucode = 'oz', }, Q482798 = { label = 'yard', ucode = 'yd', }, Q4989854 = { label = 'kilojoule', ucode = 'kJ', }, Q4992853 = { label = 'kiloton of TNT', ucode = 'kt(TNT)', }, Q5139563 = { label = 'hectopascal', ucode = 'hPa', }, Q5151 = { label = 'month', ucode = 'month', }, Q531 = { label = 'light-year', ucode = 'ly', }, Q5465723 = { label = 'foot-poundal', ucode = 'ftpdl', }, Q573 = { label = 'day', ucode = 'd', }, Q577 = { label = 'year', ucode = 'year', }, Q5879479 = { label = 'gigawatt', ucode = 'GW', }, Q6003257 = { label = 'attometre', ucode = 'am', }, Q613726 = { label = 'yottagram', ucode = 'Yg', }, Q6170164 = { label = 'yoctogram', ucode = 'yg', }, Q667419 = { label = 'long ton', ucode = 'LT', }, Q673166 = { label = 'gravity of Earth', ucode = 'g0', }, Q693944 = { label = 'grain', ucode = 'gr', }, Q6982035 = { label = 'megawatt', ucode = 'MW', }, Q712226 = { label = 'square kilometre', ucode = 'km2', }, Q723733 = { label = 'millisecond', ucode = 'ms', }, Q732454 = { label = 'megaannum', ucode = 'Myr', }, Q732707 = { label = 'megahertz', ucode = 'MHz', }, Q752079 = { label = 'gross register ton', ucode = 'grt', }, Q752197 = { label = 'kilojoule per mole', ucode = 'kJ/mol', }, Q7727 = { label = 'minute', ucode = 'min', }, Q794261 = { label = 'cubic metre per second', ucode = 'm3/s', }, Q809678 = { label = 'barye', ucode = 'Ba', }, Q81292 = { label = 'acre', ucode = 'acre', }, Q81454 = { label = 'ångström', ucode = 'angstrom', }, Q828224 = { label = 'kilometre', ucode = 'km', }, Q83327 = { label = 'electronvolt', ucode = 'eV', }, Q838801 = { label = 'nanosecond', ucode = 'ns', }, Q842015 = { label = 'microsecond', ucode = 'us', }, Q844211 = { label = 'kilogram per cubic metre', ucode = 'kg/m3', }, Q844338 = { label = 'hectometre', ucode = 'hm', }, Q844976 = { label = 'oersted', ucode = 'Oe', }, Q848856 = { label = 'decametre', ucode = 'dam', }, Q854546 = { label = 'gigametre', ucode = 'Gm', }, Q857027 = { label = 'square foot', ucode = 'sqft', }, Q9048643 = { label = 'nanolitre', ucode = 'nl', }, Q93318 = { label = 'nautical mile', ucode = 'nmi', }, } return { wikidata_units = wikidata_units } 780312bf04e64ca1dd5fb2b59dc26b420a30ab56 Template:About 10 311 447 2021-09-16T00:56:50Z wikipedia>Wbm1058 0 should implement in [[Module:About]]. Piped {{!}} links causing false positives. wikitext text/x-wiki {{#invoke:about|about}}<noinclude> {{Documentation}} </noinclude> 34b07e47d9b8220bf56dd9882945ad464b21a731 Module:Unsubst 828 730 1123 2021-10-08T18:22:16Z wikipedia>Trappist the monk 0 sync from sandbox; see [[Module_talk:Unsubst#template_invocation_name_override|talk]]; Scribunto text/plain local checkType = require('libraryUtil').checkType local p = {} local BODY_PARAM = '$B' local specialParams = { ['$params'] = 'parameter list', ['$aliases'] = 'parameter aliases', ['$flags'] = 'flags', ['$B'] = 'template content', ['$template-name'] = 'template invocation name override', } function p.main(frame, body) -- If we are substing, this function returns a template invocation, and if -- not, it returns the template body. The template body can be specified in -- the body parameter, or in the template parameter defined in the -- BODY_PARAM variable. This function can be called from Lua or from -- #invoke. -- Return the template body if we aren't substing. if not mw.isSubsting() then if body ~= nil then return body elseif frame.args[BODY_PARAM] ~= nil then return frame.args[BODY_PARAM] else error(string.format( "no template content specified (use parameter '%s' from #invoke)", BODY_PARAM ), 2) end end -- Sanity check for the frame object. if type(frame) ~= 'table' or type(frame.getParent) ~= 'function' or not frame:getParent() then error( "argument #1 to 'main' must be a frame object with a parent " .. "frame available", 2 ) end -- Find the invocation name. local mTemplateInvocation = require('Module:Template invocation') local name if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then name = frame.args['$template-name'] -- override whatever the template name is with this name else name = mTemplateInvocation.name(frame:getParent():getTitle()) end -- Combine passed args with passed defaults local args = {} if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then for k, v in pairs( frame:getParent().args ) do args[k] = v end for k, v in pairs( frame.args ) do if not specialParams[k] then if v == '__DATE__' then v = mw.getContentLanguage():formatDate( 'F Y' ) end args[k] = v end end else for k, v in pairs( frame.args ) do if not specialParams[k] then if v == '__DATE__' then v = mw.getContentLanguage():formatDate( 'F Y' ) end args[k] = v end end for k, v in pairs( frame:getParent().args ) do args[k] = v end end -- Trim parameters, if not specified otherwise if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end end -- Pull information from parameter aliases local aliases = {} if frame.args['$aliases'] then local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' ) for k, v in ipairs( list ) do local tmp = mw.text.split( v, '%s*>%s*' ) aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2]) end end for k, v in pairs( aliases ) do if args[k] and ( not args[v] or args[v] == '' ) then args[v] = args[k] end args[k] = nil end -- Remove empty parameters, if specified if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then local tmp = 0 for k, v in ipairs( args ) do if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then tmp = k else break end end for k, v in pairs( args ) do if v == '' then if not (type(k) == 'number' and k < tmp) then args[k] = nil end end end end -- Order parameters if frame.args['$params'] then local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {} for k, v in ipairs(params) do v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v if args[v] then tmp[v], args[v] = args[v], nil end end for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end args = tmp end return mTemplateInvocation.invocation(name, args) end p[''] = p.main -- For backwards compatibility return p 7f01ffc8aa2ac4a4772f14c12e0b77e384ecabb6 Module:Format link 828 336 439 2022-10-04T13:37:11Z wikipedia>Pppery 0 Avoid Lua erroring when we run out of expensive parser function calls Scribunto text/plain -------------------------------------------------------------------------------- -- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the {{format link}} template. -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local mError -- lazily initialise [[Module:Error]] local yesno -- lazily initialise [[Module:Yesno]] local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end local function maybeItalicize(s, shouldItalicize) -- Italicize s if s is a string and the shouldItalicize parameter is true. if s and shouldItalicize then return '<i>' .. s .. '</i>' else return s end end local function parseLink(link) -- Parse a link and return a table with the link's components. -- These components are: -- - link: the link, stripped of any initial colon (always present) -- - page: the page name (always present) -- - section: the page name (may be nil) -- - display: the display text, if manually entered after a pipe (may be nil) link = removeInitialColon(link) -- Find whether a faux display value has been added with the {{!}} magic -- word. local prePipe, display = link:match('^(.-)|(.*)$') link = prePipe or link -- Find the page, if it exists. -- For links like [[#Bar]], the page will be nil. local preHash, postHash = link:match('^(.-)#(.*)$') local page if not preHash then -- We have a link like [[Foo]]. page = link elseif preHash ~= '' then -- We have a link like [[Foo#Bar]]. page = preHash end -- Find the section, if it exists. local section if postHash and postHash ~= '' then section = postHash end return { link = link, page = page, section = section, display = display, } end local function formatDisplay(parsed, options) -- Formats a display string based on a parsed link table (matching the -- output of parseLink) and an options table (matching the input options for -- _formatLink). local page = maybeItalicize(parsed.page, options.italicizePage) local section = maybeItalicize(parsed.section, options.italicizeSection) if (not section) then return page elseif (not page) then return mw.ustring.format('§&nbsp;%s', section) else return mw.ustring.format('%s §&nbsp;%s', page, section) end end local function missingArgError(target) mError = require('Module:Error') return mError.error{message = 'Error: no link or target specified! ([[' .. target .. '#Errors|help]])' } end -------------------------------------------------------------------------------- -- Main functions -------------------------------------------------------------------------------- function p.formatLink(frame) -- The formatLink export function, for use in templates. yesno = require('Module:Yesno') local args = getArgs(frame) local link = args[1] or args.link local target = args[3] or args.target if not (link or target) then return missingArgError('Template:Format link') end return p._formatLink{ link = link, display = args[2] or args.display, target = target, italicizePage = yesno(args.italicizepage), italicizeSection = yesno(args.italicizesection), categorizeMissing = args.categorizemissing } end function p._formatLink(options) -- The formatLink export function, for use in modules. checkType('_formatLink', 1, options, 'table') local function check(key, expectedType) --for brevity checkTypeForNamedArg( '_formatLink', key, options[key], expectedType or 'string', true ) end check('link') check('display') check('target') check('italicizePage', 'boolean') check('italicizeSection', 'boolean') check('categorizeMissing') -- Normalize link and target and check that at least one is present if options.link == '' then options.link = nil end if options.target == '' then options.target = nil end if not (options.link or options.target) then return missingArgError('Module:Format link') end local parsed = parseLink(options.link) local display = options.display or parsed.display local catMissing = options.categorizeMissing local category = '' -- Find the display text if not display then display = formatDisplay(parsed, options) end -- Handle the target option if present if options.target then local parsedTarget = parseLink(options.target) parsed.link = parsedTarget.link parsed.page = parsedTarget.page end -- Test if page exists if a diagnostic category is specified if catMissing and (mw.ustring.len(catMissing) > 0) then local title = nil if parsed.page then title = mw.title.new(parsed.page) end if title and (not title.isExternal) then local success, exists = pcall(function() return title.exists end) if success and not exists then category = mw.ustring.format('[[Category:%s]]', catMissing) end end end -- Format the result as a link if parsed.link == display then return mw.ustring.format('[[:%s]]%s', parsed.link, category) else return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category) end end -------------------------------------------------------------------------------- -- Derived convenience functions -------------------------------------------------------------------------------- function p.formatPages(options, pages) -- Formats an array of pages using formatLink and the given options table, -- and returns it as an array. Nil values are not allowed. local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink{ link = page, categorizeMissing = options.categorizeMissing, italicizePage = options.italicizePage, italicizeSection = options.italicizeSection } end return ret end return p 1253bdd2683ee4badc33856bfd5499b09a7dca1f Template:Hlist/styles.css 10 827 1283 2022-12-26T18:00:17Z wikipedia>Izno 0 actually remove that block, someone can dig for authorship sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 8c9dd9c9c00f30eead17fe10f51d183333e81f33 Module:ConvertNumeric 828 726 1115 2023-02-09T01:04:17Z wikipedia>Johnuniq 0 please don't use tricky syntax: stick to boring stuff that works Scribunto text/plain -- Module for converting between different representations of numbers. See talk page for user documentation. -- For unit tests see: [[Module:ConvertNumeric/testcases]] -- When editing, preview with: [[Module_talk:ConvertNumeric/testcases]] -- First, edit [[Module:ConvertNumeric/sandbox]], then preview with [[Module_talk:ConvertNumeric/sandbox/testcases]] require('strict') local ones_position = { [0] = 'zero', [1] = 'one', [2] = 'two', [3] = 'three', [4] = 'four', [5] = 'five', [6] = 'six', [7] = 'seven', [8] = 'eight', [9] = 'nine', [10] = 'ten', [11] = 'eleven', [12] = 'twelve', [13] = 'thirteen', [14] = 'fourteen', [15] = 'fifteen', [16] = 'sixteen', [17] = 'seventeen', [18] = 'eighteen', [19] = 'nineteen' } local ones_position_ord = { [0] = 'zeroth', [1] = 'first', [2] = 'second', [3] = 'third', [4] = 'fourth', [5] = 'fifth', [6] = 'sixth', [7] = 'seventh', [8] = 'eighth', [9] = 'ninth', [10] = 'tenth', [11] = 'eleventh', [12] = 'twelfth', [13] = 'thirteenth', [14] = 'fourteenth', [15] = 'fifteenth', [16] = 'sixteenth', [17] = 'seventeenth', [18] = 'eighteenth', [19] = 'nineteenth' } local ones_position_plural = { [0] = 'zeros', [1] = 'ones', [2] = 'twos', [3] = 'threes', [4] = 'fours', [5] = 'fives', [6] = 'sixes', [7] = 'sevens', [8] = 'eights', [9] = 'nines', [10] = 'tens', [11] = 'elevens', [12] = 'twelves', [13] = 'thirteens', [14] = 'fourteens', [15] = 'fifteens', [16] = 'sixteens', [17] = 'seventeens', [18] = 'eighteens', [19] = 'nineteens' } local tens_position = { [2] = 'twenty', [3] = 'thirty', [4] = 'forty', [5] = 'fifty', [6] = 'sixty', [7] = 'seventy', [8] = 'eighty', [9] = 'ninety' } local tens_position_ord = { [2] = 'twentieth', [3] = 'thirtieth', [4] = 'fortieth', [5] = 'fiftieth', [6] = 'sixtieth', [7] = 'seventieth', [8] = 'eightieth', [9] = 'ninetieth' } local tens_position_plural = { [2] = 'twenties', [3] = 'thirties', [4] = 'forties', [5] = 'fifties', [6] = 'sixties', [7] = 'seventies', [8] = 'eighties', [9] = 'nineties' } local groups = { [1] = 'thousand', [2] = 'million', [3] = 'billion', [4] = 'trillion', [5] = 'quadrillion', [6] = 'quintillion', [7] = 'sextillion', [8] = 'septillion', [9] = 'octillion', [10] = 'nonillion', [11] = 'decillion', [12] = 'undecillion', [13] = 'duodecillion', [14] = 'tredecillion', [15] = 'quattuordecillion', [16] = 'quindecillion', [17] = 'sexdecillion', [18] = 'septendecillion', [19] = 'octodecillion', [20] = 'novemdecillion', [21] = 'vigintillion', [22] = 'unvigintillion', [23] = 'duovigintillion', [24] = 'tresvigintillion', [25] = 'quattuorvigintillion', [26] = 'quinquavigintillion', [27] = 'sesvigintillion', [28] = 'septemvigintillion', [29] = 'octovigintillion', [30] = 'novemvigintillion', [31] = 'trigintillion', [32] = 'untrigintillion', [33] = 'duotrigintillion', [34] = 'trestrigintillion', [35] = 'quattuortrigintillion', [36] = 'quinquatrigintillion', [37] = 'sestrigintillion', [38] = 'septentrigintillion', [39] = 'octotrigintillion', [40] = 'noventrigintillion', [41] = 'quadragintillion', [51] = 'quinquagintillion', [61] = 'sexagintillion', [71] = 'septuagintillion', [81] = 'octogintillion', [91] = 'nonagintillion', [101] = 'centillion', [102] = 'uncentillion', [103] = 'duocentillion', [104] = 'trescentillion', [111] = 'decicentillion', [112] = 'undecicentillion', [121] = 'viginticentillion', [122] = 'unviginticentillion', [131] = 'trigintacentillion', [141] = 'quadragintacentillion', [151] = 'quinquagintacentillion', [161] = 'sexagintacentillion', [171] = 'septuagintacentillion', [181] = 'octogintacentillion', [191] = 'nonagintacentillion', [201] = 'ducentillion', [301] = 'trecentillion', [401] = 'quadringentillion', [501] = 'quingentillion', [601] = 'sescentillion', [701] = 'septingentillion', [801] = 'octingentillion', [901] = 'nongentillion', [1001] = 'millinillion', } local roman_numerals = { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 } local engord_tens_end = { ['twentieth'] = 20, ['thirtieth'] = 30, ['fortieth'] = 40, ['fiftieth'] = 50, ['sixtieth'] = 60, ['seventieth'] = 70, ['eightieth'] = 80, ['ninetieth'] = 90, } local eng_tens_cont = { ['twenty'] = 20, ['thirty'] = 30, ['forty'] = 40, ['fifty'] = 50, ['sixty'] = 60, ['seventy'] = 70, ['eighty'] = 80, ['ninety'] = 90, } -- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns { -1, errorstring } on error. local function roman_to_numeral(roman) if type(roman) ~= "string" then return -1, "roman numeral not a string" end local rev = roman:reverse() local raising = true local last = 0 local result = 0 for i = 1, #rev do local c = rev:sub(i, i) local next = roman_numerals[c] if next == nil then return -1, "roman numeral contains illegal character " .. c end if next > last then result = result + next raising = true elseif next < last then result = result - next raising = false elseif raising then result = result + next else result = result - next end last = next end return result end -- Converts a given integer between 0 and 100 to English text (e.g. 47 -> forty-seven). local function numeral_to_english_less_100(num, ordinal, plural, zero) local terminal_ones, terminal_tens if ordinal then terminal_ones = ones_position_ord terminal_tens = tens_position_ord elseif plural then terminal_ones = ones_position_plural terminal_tens = tens_position_plural else terminal_ones = ones_position terminal_tens = tens_position end if num == 0 and zero ~= nil then return zero elseif num < 20 then return terminal_ones[num] elseif num % 10 == 0 then return terminal_tens[num / 10] else return tens_position[math.floor(num / 10)] .. '-' .. terminal_ones[num % 10] end end local function standard_suffix(ordinal, plural) if ordinal then return 'th' end if plural then return 's' end return '' end -- Converts a given integer (in string form) between 0 and 1000 to English text (e.g. 47 -> forty-seven). local function numeral_to_english_less_1000(num, use_and, ordinal, plural, zero) num = tonumber(num) if num < 100 then return numeral_to_english_less_100(num, ordinal, plural, zero) elseif num % 100 == 0 then return ones_position[num/100] .. ' hundred' .. standard_suffix(ordinal, plural) else return ones_position[math.floor(num/100)] .. ' hundred ' .. (use_and and 'and ' or '') .. numeral_to_english_less_100(num % 100, ordinal, plural, zero) end end -- Converts an ordinal in English text from 'zeroth' to 'ninety-ninth' inclusive to a number [0–99], else -1. local function english_to_ordinal(english) local eng = string.lower(english or '') local engord_lt20 = {} -- ones_position_ord{} keys & values swapped for k, v in pairs( ones_position_ord ) do engord_lt20[v] = k end if engord_lt20[eng] then return engord_lt20[eng] -- e.g. first -> 1 elseif engord_tens_end[eng] then return engord_tens_end[eng] -- e.g. ninetieth -> 90 else local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$') if tens and ones then local tens_cont = eng_tens_cont[tens] local ones_end = engord_lt20[ones] if tens_cont and ones_end then return tens_cont + ones_end -- e.g. ninety-ninth -> 99 end end end return -1 -- Failed end -- Converts a number in English text from 'zero' to 'ninety-nine' inclusive to a number [0–99], else -1. local function english_to_numeral(english) local eng = string.lower(english or '') local eng_lt20 = { ['single'] = 1 } -- ones_position{} keys & values swapped for k, v in pairs( ones_position ) do eng_lt20[v] = k end if eng_lt20[eng] then return eng_lt20[eng] -- e.g. one -> 1 elseif eng_tens_cont[eng] then return eng_tens_cont[eng] -- e.g. ninety -> 90 else local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$') if tens and ones then local tens_cont = eng_tens_cont[tens] local ones_end = eng_lt20[ones] if tens_cont and ones_end then return tens_cont + ones_end -- e.g. ninety-nine -> 99 end end end return -1 -- Failed end -- Converts a number expressed as a string in scientific notation to a string in standard decimal notation -- e.g. 1.23E5 -> 123000, 1.23E-5 = .0000123. Conversion is exact, no rounding is performed. local function scientific_notation_to_decimal(num) local exponent, subs = num:gsub("^%-?%d*%.?%d*%-?[Ee]([+%-]?%d+)$", "%1") if subs == 0 then return num end -- Input not in scientific notation, just return unmodified exponent = tonumber(exponent) local negative = num:find("^%-") local _, decimal_pos = num:find("%.") -- Mantissa will consist of all decimal digits with no decimal point local mantissa = num:gsub("^%-?(%d*)%.?(%d*)%-?[Ee][+%-]?%d+$", "%1%2") if negative and decimal_pos then decimal_pos = decimal_pos - 1 end if not decimal_pos then decimal_pos = #mantissa + 1 end -- Remove leading zeros unless decimal point is in first position while decimal_pos > 1 and mantissa:sub(1,1) == '0' do mantissa = mantissa:sub(2) decimal_pos = decimal_pos - 1 end -- Shift decimal point right for exponent > 0 while exponent > 0 do decimal_pos = decimal_pos + 1 exponent = exponent - 1 if decimal_pos > #mantissa + 1 then mantissa = mantissa .. '0' end -- Remove leading zeros unless decimal point is in first position while decimal_pos > 1 and mantissa:sub(1,1) == '0' do mantissa = mantissa:sub(2) decimal_pos = decimal_pos - 1 end end -- Shift decimal point left for exponent < 0 while exponent < 0 do if decimal_pos == 1 then mantissa = '0' .. mantissa else decimal_pos = decimal_pos - 1 end exponent = exponent + 1 end -- Insert decimal point in correct position and return return (negative and '-' or '') .. mantissa:sub(1, decimal_pos - 1) .. '.' .. mantissa:sub(decimal_pos) end -- Rounds a number to the nearest integer (NOT USED) local function round_num(x) if x%1 >= 0.5 then return math.ceil(x) else return math.floor(x) end end -- Rounds a number to the nearest two-word number (round = up, down, or "on" for round to nearest). -- Numbers with two digits before the decimal will be rounded to an integer as specified by round. -- Larger numbers will be rounded to a number with only one nonzero digit in front and all other digits zero. -- Negative sign is preserved and does not count towards word limit. local function round_for_english(num, round) -- If an integer with at most two digits, just return if num:find("^%-?%d?%d%.?$") then return num end local negative = num:find("^%-") if negative then -- We're rounding magnitude so flip it if round == 'up' then round = 'down' elseif round == 'down' then round = 'up' end end -- If at most two digits before decimal, round to integer and return local _, _, small_int, trailing_digits, round_digit = num:find("^%-?(%d?%d?)%.((%d)%d*)$") if small_int then if small_int == '' then small_int = '0' end if (round == 'up' and trailing_digits:find('[1-9]')) or (round == 'on' and tonumber(round_digit) >= 5) then small_int = tostring(tonumber(small_int) + 1) end return (negative and '-' or '') .. small_int end -- When rounding up, any number with > 1 nonzero digit will round up (e.g. 1000000.001 rounds up to 2000000) local nonzero_digits = 0 for digit in num:gfind("[1-9]") do nonzero_digits = nonzero_digits + 1 end num = num:gsub("%.%d*$", "") -- Remove decimal part -- Second digit used to determine which way to round lead digit local _, _, lead_digit, round_digit, round_digit_2, rest = num:find("^%-?(%d)(%d)(%d)(%d*)$") if tonumber(lead_digit .. round_digit) < 20 and (1 + #rest) % 3 == 0 then -- In English numbers < 20 are one word so put 2 digits in lead and round based on 3rd lead_digit = lead_digit .. round_digit round_digit = round_digit_2 else rest = round_digit_2 .. rest end if (round == 'up' and nonzero_digits > 1) or (round == 'on' and tonumber(round_digit) >= 5) then lead_digit = tostring(tonumber(lead_digit) + 1) end -- All digits but lead digit will turn to zero rest = rest:gsub("%d", "0") return (negative and '-' or '') .. lead_digit .. '0' .. rest end local denominators = { [2] = { 'half', plural = 'halves' }, [3] = { 'third' }, [4] = { 'quarter', us = 'fourth' }, [5] = { 'fifth' }, [6] = { 'sixth' }, [8] = { 'eighth' }, [9] = { 'ninth' }, [10] = { 'tenth' }, [16] = { 'sixteenth' }, } -- Return status, fraction where: -- status is a string: -- "finished" if there is a fraction with no whole number; -- "ok" if fraction is empty or valid; -- "unsupported" if bad fraction; -- fraction is a string giving (numerator / denominator) as English text, or is "". -- Only unsigned fractions with a very limited range of values are supported, -- except that if whole is empty, the numerator can use "-" to indicate negative. -- whole (string or nil): nil or "" if no number before the fraction -- numerator (string or nil): numerator, if any (default = 1 if a denominator is given) -- denominator (string or nil): denominator, if any -- sp_us (boolean): true if sp=us -- negative_word (string): word to use for negative sign, if whole is empty -- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half" local function fraction_to_english(whole, numerator, denominator, sp_us, negative_word, use_one) if numerator or denominator then local finished = (whole == nil or whole == '') local sign = '' if numerator then if finished and numerator:sub(1, 1) == '-' then numerator = numerator:sub(2) sign = negative_word .. ' ' end else numerator = '1' end if not numerator:match('^%d+$') or not denominator or not denominator:match('^%d+$') then return 'unsupported', '' end numerator = tonumber(numerator) denominator = tonumber(denominator) local dendata = denominators[denominator] if not (dendata and 1 <= numerator and numerator <= 99) then return 'unsupported', '' end local numstr, denstr local sep = '-' if numerator == 1 then denstr = sp_us and dendata.us or dendata[1] if finished or use_one then numstr = 'one' elseif denstr:match('^[aeiou]') then numstr = 'an' sep = ' ' else numstr = 'a' sep = ' ' end else numstr = numeral_to_english_less_100(numerator) denstr = dendata.plural if not denstr then denstr = (sp_us and dendata.us or dendata[1]) .. 's' end end if finished then return 'finished', sign .. numstr .. sep .. denstr end return 'ok', ' and ' .. numstr .. sep .. denstr end return 'ok', '' end -- Takes a decimal number and converts it to English text. -- Return nil if a fraction cannot be converted (only some numbers are supported for fractions). -- num (string or nil): the number to convert. -- Can be an arbitrarily large decimal, such as "-123456789123456789.345", and -- can use scientific notation (e.g. "1.23E5"). -- May fail for very large numbers not listed in "groups" such as "1E4000". -- num is nil if there is no whole number before a fraction. -- numerator (string or nil): numerator of fraction (nil if no fraction) -- denominator (string or nil): denominator of fraction (nil if no fraction) -- capitalize (boolean): whether to capitalize the result (e.g. 'One' instead of 'one') -- use_and (boolean): whether to use the word 'and' between tens/ones place and higher places -- hyphenate (boolean): whether to hyphenate all words in the result, useful as an adjective -- ordinal (boolean): whether to produce an ordinal (e.g. 'first' instead of 'one') -- plural (boolean): whether to pluralize the resulting number -- links: nil: do not add any links; 'on': link "billion" and larger to Orders of magnitude article; -- any other text: list of numbers to link (e.g. "billion,quadrillion") -- negative_word: word to use for negative sign (typically 'negative' or 'minus'; nil to use default) -- round: nil or '': no rounding; 'on': round to nearest two-word number; 'up'/'down': round up/down to two-word number -- zero: word to use for value '0' (nil to use default) -- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half" local function _numeral_to_english(num, numerator, denominator, capitalize, use_and, hyphenate, ordinal, plural, links, negative_word, round, zero, use_one) if not negative_word then if use_and then -- TODO Should 'minus' be used when do not have sp=us? -- If so, need to update testcases, and need to fix "minus zero". -- negative_word = 'minus' negative_word = 'negative' else negative_word = 'negative' end end local status, fraction_text = fraction_to_english(num, numerator, denominator, not use_and, negative_word, use_one) if status == 'unsupported' then return nil end if status == 'finished' then -- Input is a fraction with no whole number. -- Hack to avoid executing stuff that depends on num being a number. local s = fraction_text if hyphenate then s = s:gsub("%s", "-") end if capitalize then s = s:gsub("^%l", string.upper) end return s end num = scientific_notation_to_decimal(num) if round and round ~= '' then if round ~= 'on' and round ~= 'up' and round ~= 'down' then error("Invalid rounding mode") end num = round_for_english(num, round) end -- Separate into negative sign, num (digits before decimal), decimal_places (digits after decimal) local MINUS = '−' -- Unicode U+2212 MINUS SIGN (may be in values from [[Module:Convert]]) if num:sub(1, #MINUS) == MINUS then num = '-' .. num:sub(#MINUS + 1) -- replace MINUS with '-' elseif num:sub(1, 1) == '+' then num = num:sub(2) -- ignore any '+' end local negative = num:find("^%-") local decimal_places, subs = num:gsub("^%-?%d*%.(%d+)$", "%1") if subs == 0 then decimal_places = nil end num, subs = num:gsub("^%-?(%d*)%.?%d*$", "%1") if num == '' and decimal_places then num = '0' end if subs == 0 or num == '' then error("Invalid decimal numeral") end -- For each group of 3 digits except the last one, print with appropriate group name (e.g. million) local s = '' while #num > 3 do if s ~= '' then s = s .. ' ' end local group_num = math.floor((#num - 1) / 3) local group = groups[group_num] local group_digits = #num - group_num*3 s = s .. numeral_to_english_less_1000(num:sub(1, group_digits), false, false, false, zero) .. ' ' if links and (((links == 'on' and group_num >= 3) or links:find(group)) and group_num <= 13) then s = s .. '[[Orders_of_magnitude_(numbers)#10' .. group_num*3 .. '|' .. group .. ']]' else s = s .. group end num = num:sub(1 + group_digits) num = num:gsub("^0*", "") -- Trim leading zeros end -- Handle final three digits of integer part if s ~= '' and num ~= '' then if #num <= 2 and use_and then s = s .. ' and ' else s = s .. ' ' end end if s == '' or num ~= '' then s = s .. numeral_to_english_less_1000(num, use_and, ordinal, plural, zero) elseif ordinal or plural then -- Round numbers like "one million" take standard suffixes for ordinal/plural s = s .. standard_suffix(ordinal, plural) end -- For decimal places (if any) output "point" followed by spelling out digit by digit if decimal_places then s = s .. ' point' for i = 1, #decimal_places do s = s .. ' ' .. ones_position[tonumber(decimal_places:sub(i,i))] end end s = s:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace if ordinal and plural then s = s .. 's' end -- s suffix works for all ordinals if negative and s ~= zero then s = negative_word .. ' ' .. s end s = s:gsub("negative zero", "zero") s = s .. fraction_text if hyphenate then s = s:gsub("%s", "-") end if capitalize then s = s:gsub("^%l", string.upper) end return s end local function _numeral_to_english2(args) local num = tostring(args.num) num = num:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace num = num:gsub(",", "") -- Remove commas num = num:gsub("^<span[^<>]*></span>", "") -- Generated by Template:age if num ~= '' then -- a fraction may have an empty whole number if not num:find("^%-?%d*%.?%d*%-?[Ee]?[+%-]?%d*$") then -- Input not in a valid format, try to eval it as an expr to see -- if that produces a number (e.g. "3 + 5" will become "8"). local noerr, result = pcall(mw.ext.ParserFunctions.expr, num) if noerr then num = result end end end -- Call helper function passing args return _numeral_to_english( num, args['numerator'], args['denominator'], args['capitalize'], args['use_and'], args['hyphenate'], args['ordinal'], args['plural'], args['links'], args['negative_word'], args['round'], args['zero'], args['use_one'] ) or '' end local p = { -- Functions that can be called from another module roman_to_numeral = roman_to_numeral, spell_number = _numeral_to_english, spell_number2 = _numeral_to_english2, english_to_ordinal = english_to_ordinal, english_to_numeral = english_to_numeral, } function p._roman_to_numeral(frame) -- Callable via {{#invoke:ConvertNumeric|_roman_to_numeral|VI}} return roman_to_numeral(frame.args[1]) end function p._english_to_ordinal(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_ordinal|First}} return english_to_ordinal(frame.args[1]) end function p._english_to_numeral(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_numeral|One}} return english_to_numeral(frame.args[1]) end function p.numeral_to_english(frame) local args = frame.args -- Tail call to helper function passing args from frame return _numeral_to_english2{ ['num'] = args[1], ['numerator'] = args['numerator'], ['denominator'] = args['denominator'], ['capitalize'] = args['case'] == 'U' or args['case'] == 'u', ['use_and'] = args['sp'] ~= 'us', ['hyphenate'] = args['adj'] == 'on', ['ordinal'] = args['ord'] == 'on', ['plural'] = args['pl'] == 'on', ['links'] = args['lk'], ['negative_word'] = args['negative'], ['round'] = args['round'], ['zero'] = args['zero'], ['use_one'] = args['one'] == 'one' -- experiment: using '|one=one' makes fraction 2+1/2 give "two and one-half" instead of "two and a half" } end ---- recursive function for p.decToHex local function decToHexDigit(dec) local dig = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"} local div = math.floor(dec/16) local mod = dec-(16*div) if div >= 1 then return decToHexDigit(div)..dig[mod+1] else return dig[mod+1] end end -- I think this is supposed to be done with a tail call but first I want something that works at all ---- finds all the decimal numbers in the input text and hexes each of them function p.decToHex(frame) local args=frame.args local parent=frame.getParent(frame) local pargs={} if parent then pargs=parent.args end local text=args[1] or pargs[1] or "" local minlength=args.minlength or pargs.minlength or 1 minlength=tonumber(minlength) local prowl=mw.ustring.gmatch(text,"(.-)(%d+)") local output="" repeat local chaff,dec=prowl() if not(dec) then break end local hex=decToHexDigit(dec) while (mw.ustring.len(hex)<minlength) do hex="0"..hex end output=output..chaff..hex until false local chaff=mw.ustring.match(text,"(%D+)$") or "" return output..chaff end return p dbb876f8710ee1407b421a28b3e9bc5a6ea36cda Module:Exponential search 828 327 421 2023-02-10T20:10:53Z wikipedia>Uzume 0 strict Scribunto text/plain -- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, lower, upper) else upper = i i = midPoint(lower, upper) return search(testFunc, i, lower, upper) end end return function (testFunc, init) checkType('Exponential search', 1, testFunc, 'function') checkType('Exponential search', 2, init, 'number', true) if init and (init < 1 or init ~= floor(init) or init == math.huge) then error(string.format( "invalid init value '%s' detected in argument #2 to " .. "'Exponential search' (init value must be a positive integer)", tostring(init) ), 2) end init = init or 2 if not testFunc(1) then return nil end return search(testFunc, init, 1, nil) end a9037be0c44536be79b2d7a26155bfb907368ae7 Template:Val 10 717 1097 2023-04-02T01:46:23Z wikipedia>Dinoguy1000 0 correct safesubst usage wikitext text/x-wiki <includeonly>{{safesubst:<noinclude/>#invoke:val|main}}</includeonly><noinclude> {{documentation}} </noinclude> de315e9728588de49567fc363ccc28b987b6e298 Template:Fraction/styles.css 10 728 1119 2023-05-15T17:30:42Z wikipedia>Izno 0 clip-path now supported sanitized-css text/css /* {{pp|small=y}} */ .frac { white-space: nowrap; } .frac .num, .frac .den { font-size: 80%; line-height: 0; /* we want this inline */ vertical-align: super; } .frac .den { vertical-align: sub; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } b28507c69a3866957f0cad2cbdb76d24154ba271 Module:Hatnote list 828 337 441 2023-11-13T21:00:31Z wikipedia>Nihiltres 0 Updated from sandbox: added support for punctuation collapse when text is italicized. The update's content includes changes by users Johnuniq, Dexxor, and Nihiltres. Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introduced -- -- are andList & orList helpers for formatting lists with those conjunctions. -- -------------------------------------------------------------------------------- local mArguments --initialize lazily local mFormatLink = require('Module:Format link') local mHatnote = require('Module:Hatnote') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} -------------------------------------------------------------------------------- -- List stringification helper functions -- -- These functions are used for stringifying lists, usually page lists inside -- the "Y" portion of "For X, see Y" for-see items. -------------------------------------------------------------------------------- --default options table used across the list stringification functions local stringifyListDefaultOptions = { conjunction = "and", separator = ",", altSeparator = ";", space = " ", formatted = false } --Searches display text only local function searchDisp(haystack, needle) return string.find( string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle ) end -- Stringifies a list generically; probably shouldn't be used directly local function stringifyList(list, options) -- Type-checks, defaults, and a shortcut checkType("stringifyList", 1, list, "table") if #list == 0 then return nil end checkType("stringifyList", 2, options, "table", true) options = options or {} for k, v in pairs(stringifyListDefaultOptions) do if options[k] == nil then options[k] = v end end local s = options.space -- Format the list if requested if options.formatted then list = mFormatLink.formatPages( {categorizeMissing = mHatnote.missingTargetCat}, list ) end -- Set the separator; if any item contains it, use the alternate separator local separator = options.separator for k, v in pairs(list) do if searchDisp(v, separator) then separator = options.altSeparator break end end -- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§" local conjunction = s .. options.conjunction .. s if #list == 2 and searchDisp(list[1], "§") or #list > 2 then conjunction = separator .. conjunction end -- Return the formatted string return mw.text.listToText(list, separator .. s, conjunction) end --DRY function function p.conjList (conj, list, fmt) return stringifyList(list, {conjunction = conj, formatted = fmt}) end -- Stringifies lists with "and" or "or" function p.andList (...) return p.conjList("and", ...) end function p.orList (...) return p.conjList("or", ...) end -------------------------------------------------------------------------------- -- For see -- -- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the -- {{about}} and {{redirect}} templates and their variants. -------------------------------------------------------------------------------- --default options table used across the forSee family of functions local forSeeDefaultOptions = { andKeyword = 'and', title = mw.title.getCurrentTitle().text, otherText = 'other uses', forSeeForm = 'For %s, see %s.', } --Collapses duplicate punctuation at end of string, ignoring italics and links local function punctuationCollapse (text) return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text end -- Structures arguments into a table for stringification, & options function p.forSeeArgsToTable (args, from, options) -- Type-checks and defaults checkType("forSeeArgsToTable", 1, args, 'table') checkType("forSeeArgsToTable", 2, from, 'number', true) from = from or 1 checkType("forSeeArgsToTable", 3, options, 'table', true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- maxArg's gotten manually because getArgs() and table.maxn aren't friends local maxArg = 0 for k, v in pairs(args) do if type(k) == 'number' and k > maxArg then maxArg = k end end -- Structure the data out from the parameter list: -- * forTable is the wrapper table, with forRow rows -- * Rows are tables of a "use" string & a "pages" table of pagename strings -- * Blanks are left empty for defaulting elsewhere, but can terminate list local forTable = {} local i = from local terminated = false -- If there is extra text, and no arguments are given, give nil value -- to not produce default of "For other uses, see foo (disambiguation)" if options.extratext and i > maxArg then return nil end -- Loop to generate rows repeat -- New empty row local forRow = {} -- On blank use, assume list's ended & break at end of this loop forRow.use = args[i] if not args[i] then terminated = true end -- New empty list of pages forRow.pages = {} -- Insert first pages item if present table.insert(forRow.pages, args[i + 1]) -- If the param after next is "and", do inner loop to collect params -- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3} while args[i + 2] == options.andKeyword do if args[i + 3] then table.insert(forRow.pages, args[i + 3]) end -- Increment to next "and" i = i + 2 end -- Increment to next use i = i + 2 -- Append the row table.insert(forTable, forRow) until terminated or i > maxArg return forTable end -- Stringifies a table as formatted by forSeeArgsToTable function p.forSeeTableToString (forSeeTable, options) -- Type-checks and defaults checkType("forSeeTableToString", 1, forSeeTable, "table", true) checkType("forSeeTableToString", 2, options, "table", true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- Stringify each for-see item into a list local strList = {} if forSeeTable then for k, v in pairs(forSeeTable) do local useStr = v.use or options.otherText local pagesStr = p.andList(v.pages, true) or mFormatLink._formatLink{ categorizeMissing = mHatnote.missingTargetCat, link = mHatnote.disambiguate(options.title) } local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr) forSeeStr = punctuationCollapse(forSeeStr) table.insert(strList, forSeeStr) end end if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end -- Return the concatenated list return table.concat(strList, ' ') end -- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps -- but not blank/whitespace values. Ignores named args and args < "from". function p._forSee (args, from, options) local forSeeTable = p.forSeeArgsToTable(args, from, options) return p.forSeeTableToString(forSeeTable, options) end -- As _forSee, but uses the frame. function p.forSee (frame, from, options) mArguments = require('Module:Arguments') return p._forSee(mArguments.getArgs(frame), from, options) end return p 1c8e6212115f76ecc3db8d05137011cd18207988 Template:Fraction 10 727 1117 2024-01-16T00:53:18Z wikipedia>Jonesey95 0 readability per TPER wikitext text/x-wiki <templatestyles src="Fraction/styles.css" /><!-- --><span class="frac"><!-- -->{{#if:{{{3|}}}<!-- if 3 -->|{{{1}}}<span class="sr-only">+</span><span class="num">{{{2}}}</span>&frasl;<span class="den">{{{3}}}</span><!-- then 1 2/3 -->|{{#if:{{{2|}}}<!-- elseif 2 -->|<span class="num">{{{1}}}</span>&frasl;<span class="den">{{{2}}}</span><!-- then 1/2 -->|{{#if:{{{1|}}}<!-- elseif 1 -->|<span class="num">1</span>&frasl;<span class="den">{{{1}}}</span><!-- then 1/1 -->|&frasl;<!-- else 0, a slash -->}}<!-- endif 1 -->}}<!-- endif 2 -->}}<!-- endif 3 --></span><noinclude> {{documentation}} </noinclude> 92a487359898e00b80676732b41757019446ae53 Template:Hlist 10 826 1281 2024-02-17T05:01:35Z wikipedia>Pppery 0 Changed protection settings for "[[Template:Hlist]]": Always cascade protected via main page, for consistency ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite)) wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 9e3824c2e3c0e0dbef2f37556ac0b994987fecf9 Template:Sfrac/styles.css 10 732 1127 2024-03-18T19:02:06Z wikipedia>Izno 0 ws, add clip-path sanitized-css text/css /* {{pp|small=y}} */ .sfrac { white-space: nowrap; } .sfrac.tion, .sfrac .tion { display: inline-block; vertical-align: -0.5em; font-size: 85%; text-align: center; } .sfrac .num { display: block; line-height: 1em; margin: 0.0em 0.1em; border-bottom: 1px solid; } .sfrac .den { display: block; line-height: 1em; margin: 0.1em 0.1em; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); /* removed from CSS */ clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } 197429395812c1ab351775e9ab127ae0ef74564e Module:Pagetype/config 828 333 433 2024-05-16T12:23:09Z wikipedia>MSGJ 0 +cfg for non-existent pages Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Pagetype configuration data -- -- This page holds localisation and configuration data for Module:Pagetype. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -- This table holds the default page types for each namespace. Keys to this -- table should be integers that can be used as keys to mw.site.namespaces. cfg.pagetypes = { [0] = 'article', -- Main namespace [2] = 'user page', [4] = 'project page', [6] = 'file', [8] = 'interface page', -- MediaWiki namespace [10] = 'template', [12] = 'help page', [14] = 'category', [100] = 'portal', [118] = 'draft', [710] = 'Timed Text page', [828] = 'module', [2300] = 'gadget', [2302] = 'gadget definition', [-1] = 'special page', [-2] = 'file', -- Media namespace } -- This table holds the namespaces to be looked up from cfg.pagetypes by -- default. cfg.defaultNamespaces = { [0] = true, -- main [6] = true, -- file [10] = true, -- template [14] = true, -- category [828] = true, -- module } -- This table holds the namespaces to be looked up from cfg.pagetypes if -- cfg.defaultnsExtended is set. cfg.extendedNamespaces = { [0] = true, -- main [2] = true, -- user [4] = true, -- project [6] = true, -- file [8] = true, -- mediawiki [10] = true, -- template [12] = true, -- help [14] = true, -- category [100] = true, -- portal [118] = true, -- draft [828] = true, -- module } -- This table holds custom aliases for each namespace. cfg.customNamespaceAliases = { [0] = {'main'}, } -- The parameter name to set which default namespace values to be looked up from -- cfg.pagetypes. cfg.defaultns = 'defaultns' -- The value of cfg.defaultns to set all namespaces, including talk. cfg.defaultnsAll = 'all' -- The value of cfg.defaultns to set the namespaces listed in -- cfg.extendedNamespaces cfg.defaultnsExtended = 'extended' -- The value of cfg.defaultns to set no default namespaces. cfg.defaultnsNone = 'none' -- The parameter name to use for talk pages. cfg.talk = 'talk' -- The default value for talk pages. cfg.talkDefault = 'talk page' -- The parameter name to use for disambiguation pages page. cfg.dab = 'dab' -- The parameter name to use for non-existent pages. cfg.ne = 'nonexistent' cfg.neDefault = 'page' cfg.softRedirect = 'soft_redirect' cfg.softRedirectDefault = 'redirect' cfg.sia = 'sia' cfg.siaDefault = 'article' cfg.rfd = 'redirect' cfg.rfdDefault = 'redirect' -- This table holds the different possible aliases for disambiguation-class -- pages. These should be lower-case. cfg.dabAliases = { ['disambiguation'] = true, ['disambig'] = true, ['disamb'] = true, ['dab'] = true, } -- The default value for disambiguation pages. cfg.dabDefault = 'page' -- The parameter name to use for N/A-class page. cfg.na = 'na' -- This table holds the different possible aliases for N/A-class pages. These -- should be lower-case. cfg.naAliases = { ['na'] = true, ['n/a'] = true, } -- The default value for N/A-class pages. cfg.naDefault = 'page' -- The parameter name to use for redirects. cfg.redirect = 'redirect' -- The default value to use for redirects. cfg.redirectDefault = 'redirect' -- The parameter name for undefined namespaces. cfg.other = 'other' -- The value used if the module detects an undefined namespace. cfg.otherDefault = 'page' -- The usual suffix denoting a plural. cfg.plural = 's' -- This table holds plurals not formed by a simple suffix. cfg.irregularPlurals = { ["category"] = "categories" } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line 33b76bd60283986954f6a6203f163f6b304b95ee Module:List 828 828 1285 2024-05-19T16:45:46Z wikipedia>Pppery 0 Per edit request Scribunto text/plain local libUtil = require('libraryUtil') local checkType = libUtil.checkType local mTableTools = require('Module:TableTools') local p = {} local listTypes = { ['bulleted'] = true, ['unbulleted'] = true, ['horizontal'] = true, ['ordered'] = true, ['horizontal_ordered'] = true } function p.makeListData(listType, args) -- Constructs a data table to be passed to p.renderList. local data = {} -- Classes and TemplateStyles data.classes = {} data.templatestyles = '' if listType == 'horizontal' or listType == 'horizontal_ordered' then table.insert(data.classes, 'hlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Hlist/styles.css' } } elseif listType == 'unbulleted' then table.insert(data.classes, 'plainlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plainlist/styles.css' } } end table.insert(data.classes, args.class) -- Main div style data.style = args.style -- Indent for horizontal lists if listType == 'horizontal' or listType == 'horizontal_ordered' then local indent = tonumber(args.indent) indent = indent and indent * 1.6 or 0 if indent > 0 then data.marginLeft = indent .. 'em' end end -- List style types for ordered lists -- This could be "1, 2, 3", "a, b, c", or a number of others. The list style -- type is either set by the "type" attribute or the "list-style-type" CSS -- property. if listType == 'ordered' or listType == 'horizontal_ordered' then data.listStyleType = args.list_style_type or args['list-style-type'] data.type = args['type'] -- Detect invalid type attributes and attempt to convert them to -- list-style-type CSS properties. if data.type and not data.listStyleType and not tostring(data.type):find('^%s*[1AaIi]%s*$') then data.listStyleType = data.type data.type = nil end end -- List tag type if listType == 'ordered' or listType == 'horizontal_ordered' then data.listTag = 'ol' else data.listTag = 'ul' end -- Start number for ordered lists data.start = args.start if listType == 'horizontal_ordered' then -- Apply fix to get start numbers working with horizontal ordered lists. local startNum = tonumber(data.start) if startNum then data.counterReset = 'listitem ' .. tostring(startNum - 1) end end -- List style -- ul_style and ol_style are included for backwards compatibility. No -- distinction is made for ordered or unordered lists. data.listStyle = args.list_style -- List items -- li_style is included for backwards compatibility. item_style was included -- to be easier to understand for non-coders. data.itemStyle = args.item_style or args.li_style data.items = {} for _, num in ipairs(mTableTools.numKeys(args)) do local item = {} item.content = args[num] item.style = args['item' .. tostring(num) .. '_style'] or args['item_style' .. tostring(num)] item.value = args['item' .. tostring(num) .. '_value'] or args['item_value' .. tostring(num)] table.insert(data.items, item) end return data end function p.renderList(data) -- Renders the list HTML. -- Return the blank string if there are no list items. if type(data.items) ~= 'table' or #data.items < 1 then return '' end -- Render the main div tag. local root = mw.html.create('div') for _, class in ipairs(data.classes or {}) do root:addClass(class) end root:css{['margin-left'] = data.marginLeft} if data.style then root:cssText(data.style) end -- Render the list tag. local list = root:tag(data.listTag or 'ul') list :attr{start = data.start, type = data.type} :css{ ['counter-reset'] = data.counterReset, ['list-style-type'] = data.listStyleType } if data.listStyle then list:cssText(data.listStyle) end -- Render the list items for _, t in ipairs(data.items or {}) do local item = list:tag('li') if data.itemStyle then item:cssText(data.itemStyle) end if t.style then item:cssText(t.style) end item :attr{value = t.value} :wikitext(t.content) end return data.templatestyles .. tostring(root) end function p.renderTrackingCategories(args) local isDeprecated = false -- Tracks deprecated parameters. for k, v in pairs(args) do k = tostring(k) if k:find('^item_style%d+$') or k:find('^item_value%d+$') then isDeprecated = true break end end local ret = '' if isDeprecated then ret = ret .. '[[Category:List templates with deprecated parameters]]' end return ret end function p.makeList(listType, args) if not listType or not listTypes[listType] then error(string.format( "bad argument #1 to 'makeList' ('%s' is not a valid list type)", tostring(listType) ), 2) end checkType('makeList', 2, args, 'table') local data = p.makeListData(listType, args) local list = p.renderList(data) local trackingCategories = p.renderTrackingCategories(args) return list .. trackingCategories end for listType in pairs(listTypes) do p[listType] = function (frame) local mArguments = require('Module:Arguments') local origArgs = mArguments.getArgs(frame, { frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''), valueFunc = function (key, value) if not value or not mw.ustring.find(value, '%S') then return nil end if mw.ustring.find(value, '^%s*[%*#;:]') then return value else return value:match('^%s*(.-)%s*$') end return nil end }) -- Copy all the arguments to a new table, for faster indexing. local args = {} for k, v in pairs(origArgs) do args[k] = v end return p.makeList(listType, args) end end return p 44af96bdee7ebfa2ecf19acd4461d7a35c75856a Module:Pagetype 828 332 431 2024-05-21T17:35:20Z wikipedia>MSGJ 0 fix for files and interface messages which do exist but are not stored locally Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- This meta-module which automatically detects namespaces, and allows -- -- for a great deal of customisation. It can easily be ported to other -- -- wikis by changing the values in the [[Module:Pagetype/config]]. -- -- -- -------------------------------------------------------------------------------- -- Load config. local cfg = mw.loadData('Module:Pagetype/config') -- Load required modules. local yesno = require('Module:Yesno') local p = {} -- Look up a namespace argument in the args table. local function lookUpNamespaceArg(args, key) local arg = args[key] -- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave -- other values the same. return yesno(arg, arg) end -- Append multiple values to an array local function appendMultiple(target, source) for _, value in ipairs(source) do table.insert(target, value) end end -- Get argument keys for a title's namespace local function getNamespaceArgKeys(title) local nsInfo = mw.site.namespaces[title.namespace] local customAliases = cfg.customNamespaceAliases[title.namespace] or {} local keys = {} if nsInfo.name ~= '' then table.insert(keys, nsInfo.name) end if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then table.insert(keys, nsInfo.canonicalName) end appendMultiple(keys, nsInfo.aliases) appendMultiple(keys, customAliases) return keys end -- Get the argument for a title's namespace, if it was specified in the args table. local function getNamespaceArg(title, args) if title.isTalkPage then return lookUpNamespaceArg(args, cfg.talk) end for _, key in ipairs(getNamespaceArgKeys(title)) do local arg = lookUpNamespaceArg(args, mw.ustring.lower(key)) if arg ~= nil then return arg end end return nil end -- Look up a page type specific to the title's namespace local function getExplicitPageType(title) if title.isTalkPage then return cfg.talkDefault else return cfg.pagetypes[title.namespace] end end -- Get a default page type that is not specific to the title's namespace local function getDefaultPageType(args) local other = lookUpNamespaceArg(args, cfg.other) if type(other) == 'string' then return other else return cfg.otherDefault end end local function detectRedirects(title, args) local redirect = lookUpNamespaceArg(args, cfg.redirect) if redirect == false then -- Don't detect redirects if they have been specifically disallowed. return nil end -- Allow custom values for redirects. if not title.isRedirect then return nil elseif type(redirect) == 'string' then return redirect else return cfg.redirectDefault end end local function capitalize(pageType) local first = mw.ustring.sub(pageType, 1, 1) local rest = mw.ustring.sub(pageType, 2) return mw.ustring.upper(first) .. rest end local function pluralize(pageType) if cfg.irregularPlurals[pageType] then return cfg.irregularPlurals[pageType] else return pageType .. cfg.plural -- often 's' end end local function parseContent(title, args, optionsList) if title.namespace==828 and title.subpageText~='doc' -- don't detect modules or not title.exists -- can't check unless page exists then return nil end local content = title:getContent() if content == nil then return nil end local templates -- lazily evaluated for _, options in next, optionsList do local list, parameter, default, articleOnly = unpack(options, 1, 4) if not articleOnly or title.namespace==0 then -- only check for templates if we should... local out = lookUpNamespaceArg(args, parameter) if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them if not templates then templates = {} -- do our delayed evaluation now that we are required to content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do templates[#templates+1] = capitalize(template) end end local wantedTemplates = mw.loadData('Module:Pagetype/' .. list) local templateFound = false for _, template in next, templates do if wantedTemplates[template] then templateFound = true break end end if templateFound then if type(out)=='string' then return out elseif out ~= false and default then return default end end end end end end -- Find pages which do not exist local function nonExistent(title, args) local arg = lookUpNamespaceArg(args, cfg.ne) if arg == false then return nil end local exists = false if title.exists then -- not an article if it does not exist exists = true elseif title.namespace==8 and mw.message.new(title.text):exists() then exists = true elseif title.namespace==6 and title.fileExists then exists = true end if not exists then if type(arg) == 'string' then return arg else return cfg.naDefault end end end -- Get page types for mainspaces pages with an explicit class specified local function getMainNamespaceClassPageType(title, args) local class = args[1] if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match class = mw.ustring.lower(class) end local arg = lookUpNamespaceArg(args, cfg.na) if arg == false then -- don't check for this class if it is specifically disallowed return nil end if cfg.naAliases[class] then if type(arg) == 'string' then return arg else return cfg.naDefault end else return nil end end -- Get page type specified by an explicit namespace argument. local function getNamespaceArgPageType(title, args) local namespaceArg = getNamespaceArg(title, args) if namespaceArg == true then -- Namespace has been explicitly enabled, so return the default for -- this namespace return getExplicitPageType(title) elseif namespaceArg == false then -- Namespace has been explicitly disabled return getDefaultPageType(args) elseif namespaceArg then -- This namespaces uses custom text return namespaceArg else return nil end end -- Get page type not specified or detected by other means local function getOtherPageType(title, args) -- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes. local isInDefaultActiveNamespace = false local defaultNamespacesKey = args[cfg.defaultns] if defaultNamespacesKey == cfg.defaultnsAll then isInDefaultActiveNamespace = true else local defaultNamespaces if defaultNamespacesKey == cfg.defaultnsExtended then defaultNamespaces = cfg.extendedNamespaces elseif defaultNamespacesKey == cfg.defaultnsNone then defaultNamespaces = {} else defaultNamespaces = cfg.defaultNamespaces end isInDefaultActiveNamespace = defaultNamespaces[title.namespace] end if isInDefaultActiveNamespace then return getExplicitPageType(title) else return getDefaultPageType(args) end end function p._main(args) local title if args.page then title = mw.title.new(args.page) else title = mw.title.getCurrentTitle() end if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then title = title.subjectPageTitle end local pageType = detectRedirects(title, args) or nonExistent(title, args) or parseContent(title, args, { {'softredirect', cfg.softRedirect, cfg.softRedirectDefault}, {'setindex', cfg.sia, cfg.siaDefault, true}, {'disambiguation', cfg.dab, cfg.dabDefault, true}, {'rfd', cfg.rfd, cfg.rfdDefault}, }) or (title.namespace == 0 and getMainNamespaceClassPageType(title, args)) or getNamespaceArgPageType(title, args) or getOtherPageType(title, args) if yesno(args.plural, false) then pageType = pluralize(pageType) end if yesno(args.caps, false) then pageType = capitalize(pageType) end return pageType end function p.main(frame) local args = require('Module:Arguments').getArgs(frame) return p._main(args) end return p cb47b460d74d5df739ee7e300eeae512798bc475 Module:TableTools 828 328 423 2024-08-18T04:19:07Z wikipedia>Pppery 0 Update from sandbox per request Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) if type(orig) ~= "table" then return orig end -- already_seen stores copies of tables indexed by the original table. local copy = already_seen[orig] if copy ~= nil then return copy end copy = {} already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then setmetatable(copy, _deepCopy(mt, true, already_seen)) end end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen or {}) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if searchElement is a member of the array, and false otherwise. -- Equivalent to JavaScript array.includes(searchElement) or -- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed ------------------------------------------------------------------------------------ function p.inArray(array, searchElement, fromIndex) checkType("inArray", 1, array, "table") -- if searchElement is nil, error? fromIndex = tonumber(fromIndex) if fromIndex then if (fromIndex < 0) then fromIndex = #array + fromIndex + 1 end if fromIndex < 1 then fromIndex = 1 end for _, v in ipairs({unpack(array, fromIndex)}) do if v == searchElement then return true end end else for _, v in pairs(array) do if v == searchElement then return true end end end return false end ------------------------------------------------------------------------------------ -- merge -- -- Given the arrays, returns an array containing the elements of each input array -- in sequence. ------------------------------------------------------------------------------------ function p.merge(...) local arrays = {...} local ret = {} for i, arr in ipairs(arrays) do checkType('merge', i, arr, 'table') for _, v in ipairs(arr) do ret[#ret + 1] = v end end return ret end ------------------------------------------------------------------------------------ -- extend -- -- Extends the first array in place by appending all elements from the second -- array. ------------------------------------------------------------------------------------ function p.extend(arr1, arr2) checkType('extend', 1, arr1, 'table') checkType('extend', 2, arr2, 'table') for _, v in ipairs(arr2) do arr1[#arr1 + 1] = v end end return p 27b6a4e23d902c05ad6e005059248318bffc2a4e Module:Template invocation 828 731 1125 2024-09-05T20:21:20Z wikipedia>Pppery 0 Update name call to fix a few edge cases per request Scribunto text/plain -- This module provides functions for making MediaWiki template invocations. local checkType = require('libraryUtil').checkType local p = {} ------------------------------------------------------------------------ -- Name: p.name -- Purpose: Find a template invocation name from a page name or a -- mw.title object. -- Description: This function detects whether a string or a mw.title -- object has been passed in, and uses that to find a -- template name as it is used in template invocations. -- Parameters: title - full page name or mw.title object for the -- template (string or mw.title object) -- Returns: String ------------------------------------------------------------------------ function p.name(title) if type(title) == 'string' then title = mw.title.new(title) if not title or #title.prefixedText == 0 or #title.interwiki > 0 then error("invalid title in parameter #1 of function 'name'", 2) end elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then error("parameter #1 of function 'name' must be a string or a mw.title object", 2) end if title.namespace == 10 then local text = title.text local check = mw.title.new(text, 10) -- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo". return check and mw.title.equals(title, check) and text or title.prefixedText elseif title.namespace == 0 then return ':' .. title.prefixedText else return title.prefixedText end end ------------------------------------------------------------------------ -- Name: p.invocation -- Purpose: Construct a MediaWiki template invocation. -- Description: This function makes a template invocation from the -- name and the arguments given. Note that it isn't -- perfect: we have no way of knowing what whitespace was -- in the original invocation, the named parameters will be -- alphabetically sorted, and any parameters with duplicate keys -- will be removed. -- Parameters: name - the template name, formatted as it will appear -- in the invocation. (string) -- args - a table of template arguments. (table) -- format - formatting options. (string, optional) -- Set to "nowiki" to escape, curly braces, pipes and -- equals signs with their HTML entities. The default -- is unescaped. -- Returns: String ------------------------------------------------------------------------ function p.invocation(name, args, format) checkType('invocation', 1, name, 'string') checkType('invocation', 2, args, 'table') checkType('invocation', 3, format, 'string', true) -- Validate the args table and make a copy to work from. We need to -- make a copy of the table rather than just using the original, as -- some of the values may be erased when building the invocation. local invArgs = {} for k, v in pairs(args) do local typek = type(k) local typev = type(v) if typek ~= 'string' and typek ~= 'number' or typev ~= 'string' and typev ~= 'number' then error("invalid arguments table in parameter #2 of " .. "'invocation' (keys and values must be strings or numbers)", 2) end invArgs[k] = v end -- Get the separators to use. local seps = { openb = '{{', closeb = '}}', pipe = '|', equals = '=' } if format == 'nowiki' then for k, v in pairs(seps) do seps[k] = mw.text.nowiki(v) end end -- Build the invocation body with numbered args first, then named. local ret = {} ret[#ret + 1] = seps.openb ret[#ret + 1] = name for k, v in ipairs(invArgs) do if type(v) == 'string' and v:find('=', 1, true) then -- Likely something like 1=foo=bar which needs to be displayed as a named arg. else ret[#ret + 1] = seps.pipe ret[#ret + 1] = v invArgs[k] = nil -- Erase the key so that we don't add the value twice end end local keys = {} -- sort parameter list; better than arbitrary order for k, _ in pairs(invArgs) do keys[#keys + 1] = k end table.sort(keys, function (a, b) -- Sort with keys of type number first, then string. if type(a) == type(b) then return a < b elseif type(a) == 'number' then return true end end ) local maybeSpace = '' -- First named parameter should not be separated by a space for _, v in ipairs(keys) do -- Add named args based on sorted parameter list ret[#ret + 1] = maybeSpace .. seps.pipe ret[#ret + 1] = tostring(v) ret[#ret + 1] = seps.equals ret[#ret + 1] = invArgs[v] maybeSpace = ' ' end ret[#ret + 1] = seps.closeb return table.concat(ret) end return p 1670c64056477574789c5c21349ec2234f60dd9c Module:Convert/data 828 721 1105 2024-10-26T23:10:16Z wikipedia>Johnuniq 0 update from sandbox per [[Template talk:Convert#Module version 30]] Scribunto text/plain -- Conversion data used by [[Module:Convert]] which uses mw.loadData() for -- read-only access to this module so that it is loaded only once per page. -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. -- -- These data tables follow: -- all_units all properties for a unit, including default output -- default_exceptions exceptions for default output ('kg' and 'g' have different defaults) -- link_exceptions exceptions for links ('kg' and 'g' have different links) -- -- These tables are generated by a script which reads the wikitext of a page that -- documents the required properties of each unit; see [[:en:Module:Convert/doc]]. --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local all_units = { ["Gy"] = { _name1 = "gray", _symbol = "Gy", utype = "absorbed radiation dose", scale = 1, prefixes = 1, default = "rad", link = "Gray (unit)", }, ["rad"] = { _name1 = "rad", _symbol = "rad", utype = "absorbed radiation dose", scale = 0.01, prefixes = 1, default = "Gy", link = "Rad (unit)", }, ["cm/s2"] = { name1 = "centimetre per second squared", name1_us = "centimeter per second squared", name2 = "centimetres per second squared", name2_us = "centimeters per second squared", symbol = "cm/s<sup>2</sup>", utype = "acceleration", scale = 0.01, default = "ft/s2", link = "Gal (unit)", }, ["ft/s2"] = { name1 = "foot per second squared", name2 = "feet per second squared", symbol = "ft/s<sup>2</sup>", utype = "acceleration", scale = 0.3048, default = "m/s2", }, ["g0"] = { name1 = "standard gravity", name2 = "standard gravities", symbol = "''g''<sub>0</sub>", utype = "acceleration", scale = 9.80665, default = "m/s2", }, ["g-force"] = { name2 = "''g''", symbol = "''g''", utype = "acceleration", scale = 9.80665, default = "m/s2", link = "g-force", }, ["km/hs"] = { name1 = "kilometre per hour per second", name1_us = "kilometer per hour per second", name2 = "kilometres per hour per second", name2_us = "kilometers per hour per second", symbol = "km/(h⋅s)", utype = "acceleration", scale = 0.27777777777777779, default = "mph/s", link = "Acceleration", }, ["km/s2"] = { name1 = "kilometre per second squared", name1_us = "kilometer per second squared", name2 = "kilometres per second squared", name2_us = "kilometers per second squared", symbol = "km/s<sup>2</sup>", utype = "acceleration", scale = 1000, default = "mph/s", link = "Acceleration", }, ["m/s2"] = { name1 = "metre per second squared", name1_us = "meter per second squared", name2 = "metres per second squared", name2_us = "meters per second squared", symbol = "m/s<sup>2</sup>", utype = "acceleration", scale = 1, default = "ft/s2", }, ["mph/s"] = { name1 = "mile per hour per second", name2 = "miles per hour per second", symbol = "mph/s", utype = "acceleration", scale = 0.44704, default = "km/hs", link = "Acceleration", }, ["km/h/s"] = { target = "km/hs", }, ["standard gravity"] = { target = "g0", }, ["1000sqft"] = { name1 = "thousand square feet", name2 = "thousand square feet", symbol = "1000&nbsp;sq&nbsp;ft", utype = "area", scale = 92.90304, default = "m2", link = "Square foot", }, ["a"] = { _name1 = "are", _symbol = "a", utype = "area", scale = 100, prefixes = 1, default = "sqft", link = "Hectare#Are", }, ["acre"] = { symbol = "acre", usename = 1, utype = "area", scale = 4046.8564224, default = "ha", subdivs = { ["rood"] = { 4, default = "ha" }, ["sqperch"] = { 160, default = "ha" } }, }, ["acre-sing"] = { target = "acre", }, ["arpent"] = { symbol = "arpent", usename = 1, utype = "area", scale = 3418.89, default = "ha", }, ["cda"] = { name1 = "cuerda", symbol = "cda", utype = "area", scale = 3930.395625, default = "ha acre", }, ["daa"] = { name1 = "decare", symbol = "daa", utype = "area", scale = 1000, default = "km2 sqmi", }, ["dunam"] = { symbol = "dunam", usename = 1, utype = "area", scale = 1000, default = "km2 sqmi", }, ["dunum"] = { symbol = "dunum", usename = 1, utype = "area", scale = 1000, default = "km2 sqmi", link = "Dunam", }, ["ha"] = { name1 = "hectare", symbol = "ha", utype = "area", scale = 10000, default = "acre", }, ["hectare"] = { name1 = "hectare", symbol = "ha", usename = 1, utype = "area", scale = 10000, default = "acre", }, ["Irish acre"] = { name1 = "Irish acre", symbol = "Irish&nbsp;acres", utype = "area", scale = 6555.2385024, default = "ha", link = "Acre (Irish)", }, ["m2"] = { _name1 = "square metre", _name1_us= "square meter", _symbol = "m<sup>2</sup>", prefix_position= 8, utype = "area", scale = 1, prefixes = 2, default = "sqft", link = "Square metre", }, ["pondemaat"] = { name1 = "pondemaat", name2 = "pondemaat", symbol = "pond", utype = "area", scale = 3674.363358816, default = "m2", link = ":nl:pondemaat", }, ["pyeong"] = { name2 = "pyeong", symbol = "pyeong", usename = 1, utype = "area", scale = 3.3057851239669422, default = "m2", }, ["rai"] = { name2 = "rai", symbol = "rai", utype = "area", scale = 1600, default = "m2", link = "Rai (unit)", }, ["rood"] = { symbol = "rood", usename = 1, utype = "area", scale = 1011.7141056, default = "sqft m2", subdivs = { ["sqperch"] = { 40, default = "m2" } }, link = "Rood (unit)", }, ["sqfoot"] = { name1 = "square foot", name2 = "square foot", symbol = "sq&nbsp;ft", utype = "area", scale = 0.09290304, default = "m2", }, ["sqft"] = { name1 = "square foot", name2 = "square feet", symbol = "sq&nbsp;ft", utype = "area", scale = 0.09290304, default = "m2", }, ["sqin"] = { name1 = "square inch", name2 = "square inches", symbol = "sq&nbsp;in", utype = "area", scale = 0.00064516, default = "cm2", }, ["sqmi"] = { name1 = "square mile", symbol = "sq&nbsp;mi", utype = "area", scale = 2589988.110336, default = "km2", }, ["sqnmi"] = { name1 = "square nautical mile", symbol = "sq&nbsp;nmi", utype = "area", scale = 3429904, default = "km2 sqmi", link = "Nautical mile", }, ["sqperch"] = { name2 = "perches", symbol = "perch", usename = 1, utype = "area", scale = 25.29285264, default = "m2", link = "Rod (unit)#Area and volume", }, ["sqverst"] = { symbol = "square verst", usename = 1, utype = "area", scale = 1138062.24, default = "km2 sqmi", link = "Verst", }, ["sqyd"] = { name1 = "square yard", symbol = "sq&nbsp;yd", utype = "area", scale = 0.83612736, default = "m2", }, ["tsubo"] = { name2 = "tsubo", symbol = "tsubo", usename = 1, utype = "area", scale = 3.3057851239669422, default = "m2", link = "Japanese units of measurement#Area", }, ["acres"] = { target = "acre", }, ["are"] = { target = "a", }, ["decare"] = { target = "daa", }, ["foot2"] = { target = "sqfoot", }, ["ft2"] = { target = "sqft", }, ["in2"] = { target = "sqin", symbol = "in<sup>2</sup>", }, ["km²"] = { target = "km2", }, ["mi2"] = { target = "sqmi", }, ["million acre"] = { target = "e6acre", }, ["million acres"] = { target = "e6acre", }, ["million hectares"] = { target = "e6ha", }, ["m²"] = { target = "m2", }, ["nmi2"] = { target = "sqnmi", }, ["pond"] = { target = "pondemaat", }, ["sq arp"] = { target = "arpent", }, ["sqkm"] = { target = "km2", }, ["sqm"] = { target = "m2", }, ["square verst"] = { target = "sqverst", }, ["verst2"] = { target = "sqverst", }, ["yd2"] = { target = "sqyd", }, ["m2/ha"] = { name1 = "square metre per hectare", name1_us = "square meter per hectare", name2 = "square metres per hectare", name2_us = "square meters per hectare", symbol = "m<sup>2</sup>/ha", utype = "area per unit area", scale = 0.0001, default = "sqft/acre", link = "Basal area", }, ["sqft/acre"] = { name1 = "square foot per acre", name2 = "square feet per acre", symbol = "sq&nbsp;ft/acre", utype = "area per unit area", scale = 2.295684113865932e-5, default = "m2/ha", link = "Basal area", }, ["cent"] = { name1 = "cent", symbol = "¢", utype = "cent", scale = 1, default = "cent", link = "Cent (currency)", }, ["¢"] = { target = "cent", }, ["A.h"] = { name1 = "ampere hour", symbol = "A⋅h", utype = "charge", scale = 3600, default = "coulomb", }, ["coulomb"] = { _name1 = "coulomb", _symbol = "C", utype = "charge", scale = 1, prefixes = 1, default = "e", link = "Coulomb", }, ["e"] = { name1 = "elementary charge", symbol = "''e''", utype = "charge", scale = 1.602176487e-19, default = "coulomb", }, ["g-mol"] = { name1 = "gram-mole", symbol = "g&#8209;mol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["gmol"] = { name1 = "gram-mole", symbol = "gmol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["kmol"] = { name1 = "kilomole", symbol = "kmol", utype = "chemical amount", scale = 1000, default = "lbmol", link = "Mole (unit)", }, ["lb-mol"] = { name1 = "pound-mole", symbol = "lb&#8209;mol", utype = "chemical amount", scale = 453.59237, default = "mol", }, ["lbmol"] = { name1 = "pound-mole", symbol = "lbmol", utype = "chemical amount", scale = 453.59237, default = "mol", }, ["mol"] = { name1 = "mole", symbol = "mol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["kgCO2/L"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg(CO<sub>2</sub>)/L", utype = "co2 per unit volume", scale = 1000, default = "lbCO2/USgal", link = "Exhaust gas", }, ["lbCO2/USgal"] = { name1 = "pound per US gallon", name2 = "pounds per US gallon", symbol = "lbCO2/US&nbsp;gal", utype = "co2 per unit volume", scale = 119.82642731689663, default = "kgCO2/L", link = "Exhaust gas", }, ["oz/lb"] = { per = { "oz", "lb" }, utype = "concentration", default = "mg/kg", }, ["mg/kg"] = { per = { "mg", "kg" }, utype = "concentration", default = "oz/lb", }, ["g/dm3"] = { name1 = "gram per cubic decimetre", name1_us = "gram per cubic decimeter", name2 = "grams per cubic decimetre", name2_us = "grams per cubic decimeter", symbol = "g/dm<sup>3</sup>", utype = "density", scale = 1, default = "kg/m3", link = "Density", }, ["g/L"] = { name1 = "gram per litre", name1_us = "gram per liter", name2 = "grams per litre", name2_us = "grams per liter", symbol = "g/L", utype = "density", scale = 1, default = "lb/cuin", link = "Density", }, ["g/mL"] = { name1 = "gram per millilitre", name1_us = "gram per milliliter", name2 = "grams per millilitre", name2_us = "grams per milliliter", symbol = "g/mL", utype = "density", scale = 1000, default = "lb/cuin", link = "Density", }, ["g/ml"] = { name1 = "gram per millilitre", name1_us = "gram per milliliter", name2 = "grams per millilitre", name2_us = "grams per milliliter", symbol = "g/ml", utype = "density", scale = 1000, default = "lb/cuin", link = "Density", }, ["kg/dm3"] = { name1 = "kilogram per cubic decimetre", name1_us = "kilogram per cubic decimeter", name2 = "kilograms per cubic decimetre", name2_us = "kilograms per cubic decimeter", symbol = "kg/dm<sup>3</sup>", utype = "density", scale = 1000, default = "lb/cuft", link = "Density", }, ["kg/L"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg/L", utype = "density", scale = 1000, default = "lb/USgal", link = "Density", }, ["kg/l"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg/l", utype = "density", scale = 1000, default = "lb/USgal", link = "Density", }, ["kg/m3"] = { name1 = "kilogram per cubic metre", name1_us = "kilogram per cubic meter", name2 = "kilograms per cubic metre", name2_us = "kilograms per cubic meter", symbol = "kg/m<sup>3</sup>", utype = "density", scale = 1, default = "lb/cuyd", link = "Density", }, ["lb/cuft"] = { name1 = "pound per cubic foot", name2 = "pounds per cubic foot", symbol = "lb/cu&nbsp;ft", utype = "density", scale = 16.018463373960142, default = "g/cm3", link = "Density", }, ["lb/cuin"] = { name1 = "pound per cubic inch", name2 = "pounds per cubic inch", symbol = "lb/cu&nbsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["lb/cuyd"] = { name1 = "pound per cubic yard", name2 = "pounds per cubic yard", symbol = "lb/cu&nbsp;yd", utype = "density", scale = 0.5932764212577829, default = "kg/m3", link = "Density", }, ["lb/impgal"] = { name1 = "pound per imperial gallon", name2 = "pounds per imperial gallon", symbol = "lb/imp&nbsp;gal", utype = "density", scale = 99.776372663101697, default = "kg/L", link = "Density", }, ["lb/in3"] = { name1 = "pound per cubic inch", name2 = "pounds per cubic inch", symbol = "lb/cu&thinsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["lb/U.S.gal"] = { name1 = "pound per U.S. gallon", name2 = "pounds per U.S. gallon", symbol = "lb/U.S.&nbsp;gal", utype = "density", scale = 119.82642731689663, default = "kg/L", link = "Density", }, ["lb/USbu"] = { name1 = "pound per US bushel", name2 = "pounds per US bushel", symbol = "lb/US&nbsp;bu", utype = "density", scale = 12.871859780974471, default = "kg/m3", link = "Bushel", }, ["lb/USgal"] = { name1 = "pound per US gallon", name2 = "pounds per US gallon", symbol = "lb/US&nbsp;gal", utype = "density", scale = 119.82642731689663, default = "kg/L", link = "Density", }, ["lbm/cuin"] = { name1 = "pound mass per cubic inch", name2 = "pounds mass per cubic inch", symbol = "lbm/cu&thinsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["mg/L"] = { name1 = "milligram per litre", name1_us = "milligram per liter", name2 = "milligrams per litre", name2_us = "milligrams per liter", symbol = "mg/L", utype = "density", scale = 0.001, default = "lb/cuin", link = "Density", }, ["oz/cuin"] = { name1 = "ounce per cubic inch", name2 = "ounces per cubic inch", symbol = "oz/cu&nbsp;in", utype = "density", scale = 1729.9940443876951, default = "g/cm3", link = "Density", }, ["g/cm3"] = { per = { "g", "cm3" }, utype = "density", default = "lb/cuin", }, ["g/m3"] = { per = { "g", "m3" }, utype = "density", default = "lb/cuyd", link = "Density", }, ["Mg/m3"] = { per = { "Mg", "m3" }, utype = "density", default = "lb/cuft", }, ["mg/l"] = { per = { "mg", "ll" }, utype = "density", default = "oz/cuin", }, ["μg/dL"] = { per = { "μg", "dL" }, utype = "density", default = "lb/cuin", }, ["μg/l"] = { per = { "μg", "ll" }, utype = "density", default = "oz/cuin", }, ["lb/ft3"] = { target = "lb/cuft", }, ["lb/yd3"] = { target = "lb/cuyd", }, ["lbm/in3"] = { target = "lbm/cuin", }, ["mcg/dL"] = { target = "μg/dL", }, ["oz/in3"] = { target = "oz/cuin", }, ["ug/dL"] = { target = "μg/dL", }, ["ug/l"] = { target = "μg/l", }, ["B.O.T.U."] = { name1 = "Board of Trade Unit", symbol = "B.O.T.U.", utype = "energy", scale = 3600000, default = "MJ", link = "Kilowatt-hour", }, ["bboe"] = { name1 = "barrel of oil equivalent", name2 = "barrels of oil equivalent", symbol = "bboe", utype = "energy", scale = 6117863200, default = "GJ", }, ["BOE"] = { name1 = "barrel of oil equivalent", name2 = "barrels of oil equivalent", symbol = "BOE", utype = "energy", scale = 6117863200, default = "GJ", }, ["BTU"] = { name1 = "British thermal unit", symbol = "BTU", utype = "energy", scale = 1055.05585262, default = "kJ", }, ["Btu"] = { name1 = "British thermal unit", symbol = "Btu", utype = "energy", scale = 1055.05585262, default = "kJ", }, ["BTU-39F"] = { name1 = "British thermal unit (39°F)", name2 = "British thermal units (39°F)", symbol = "BTU<sub>39°F</sub>", utype = "energy", scale = 1059.67, default = "kJ", link = "British thermal unit", }, ["Btu-39F"] = { name1 = "British thermal unit (39°F)", name2 = "British thermal units (39°F)", symbol = "Btu<sub>39°F</sub>", utype = "energy", scale = 1059.67, default = "kJ", link = "British thermal unit", }, ["BTU-59F"] = { name1 = "British thermal unit (59°F)", name2 = "British thermal units (59°F)", symbol = "BTU<sub>59°F</sub>", utype = "energy", scale = 1054.804, default = "kJ", link = "British thermal unit", }, ["Btu-59F"] = { name1 = "British thermal unit (59°F)", name2 = "British thermal units (59°F)", symbol = "Btu<sub>59°F</sub>", utype = "energy", scale = 1054.804, default = "kJ", link = "British thermal unit", }, ["BTU-60F"] = { name1 = "British thermal unit (60°F)", name2 = "British thermal units (60°F)", symbol = "BTU<sub>60°F</sub>", utype = "energy", scale = 1054.68, default = "kJ", link = "British thermal unit", }, ["Btu-60F"] = { name1 = "British thermal unit (60°F)", name2 = "British thermal units (60°F)", symbol = "Btu<sub>60°F</sub>", utype = "energy", scale = 1054.68, default = "kJ", link = "British thermal unit", }, ["BTU-63F"] = { name1 = "British thermal unit (63°F)", name2 = "British thermal units (63°F)", symbol = "BTU<sub>63°F</sub>", utype = "energy", scale = 1054.6, default = "kJ", link = "British thermal unit", }, ["Btu-63F"] = { name1 = "British thermal unit (63°F)", name2 = "British thermal units (63°F)", symbol = "Btu<sub>63°F</sub>", utype = "energy", scale = 1054.6, default = "kJ", link = "British thermal unit", }, ["BTU-ISO"] = { name1 = "British thermal unit (ISO)", name2 = "British thermal units (ISO)", symbol = "BTU<sub>ISO</sub>", utype = "energy", scale = 1055.056, default = "kJ", link = "British thermal unit", }, ["Btu-ISO"] = { target = "BTU-ISO", }, ["BTU-IT"] = { name1 = "British thermal unit (IT)", name2 = "British thermal units (IT)", symbol = "BTU<sub>IT</sub>", utype = "energy", scale = 1055.05585262, default = "kJ", link = "British thermal unit", }, ["Btu-IT"] = { name1 = "British thermal unit (IT)", name2 = "British thermal units (IT)", symbol = "Btu<sub>IT</sub>", utype = "energy", scale = 1055.05585262, default = "kJ", link = "British thermal unit", }, ["BTU-mean"] = { name1 = "British thermal unit (mean)", name2 = "British thermal units (mean)", symbol = "BTU<sub>mean</sub>", utype = "energy", scale = 1055.87, default = "kJ", link = "British thermal unit", }, ["Btu-mean"] = { name1 = "British thermal unit (mean)", name2 = "British thermal units (mean)", symbol = "Btu<sub>mean</sub>", utype = "energy", scale = 1055.87, default = "kJ", link = "British thermal unit", }, ["BTU-th"] = { name1 = "British thermal unit (thermochemical)", name2 = "British thermal units (thermochemical)", symbol = "BTU<sub>th</sub>", utype = "energy", scale = 1054.35026444, default = "kJ", link = "British thermal unit", }, ["Btu-th"] = { name1 = "British thermal unit (thermochemical)", name2 = "British thermal units (thermochemical)", symbol = "Btu<sub>th</sub>", utype = "energy", scale = 1054.35026444, default = "kJ", link = "British thermal unit", }, ["Cal"] = { name1 = "calorie", symbol = "Cal", utype = "energy", scale = 4184, default = "kJ", }, ["cal"] = { name1 = "calorie", symbol = "cal", utype = "energy", scale = 4.184, default = "J", }, ["Cal-15"] = { name1 = "Calorie (15°C)", name2 = "Calories (15°C)", symbol = "Cal<sub>15</sub>", utype = "energy", scale = 4185.8, default = "kJ", link = "Calorie", }, ["cal-15"] = { name1 = "calorie (15°C)", name2 = "calories (15°C)", symbol = "cal<sub>15</sub>", utype = "energy", scale = 4.1858, default = "J", link = "Calorie", }, ["Cal-IT"] = { name1 = "Calorie (International Steam Table)", name2 = "Calories (International Steam Table)", symbol = "Cal<sub>IT</sub>", utype = "energy", scale = 4186.8, default = "kJ", link = "Calorie", }, ["cal-IT"] = { name1 = "calorie (International Steam Table)", name2 = "calories (International Steam Table)", symbol = "cal<sub>IT</sub>", utype = "energy", scale = 4.1868, default = "J", link = "Calorie", }, ["Cal-th"] = { name1 = "Calorie (thermochemical)", name2 = "Calories (thermochemical)", symbol = "Cal<sub>th</sub>", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["cal-th"] = { name1 = "calorie (thermochemical)", name2 = "calories (thermochemical)", symbol = "cal<sub>th</sub>", utype = "energy", scale = 4.184, default = "J", link = "Calorie", }, ["CHU-IT"] = { name1 = "Celsius heat unit (International Table)", name2 = "Celsius heat units (International Table)", symbol = "CHU<sub>IT</sub>", utype = "energy", scale = 1899.100534716, default = "kJ", link = "Conversion of units#Energy", }, ["cufootnaturalgas"] = { name1 = "cubic foot of natural gas", name2 = "cubic foot of natural gas", symbol = "cuftnaturalgas", usename = 1, utype = "energy", scale = 1055055.85262, default = "MJ", link = "Conversion of units#Energy", }, ["cuftnaturalgas"] = { name1 = "cubic foot of natural gas", name2 = "cubic feet of natural gas", symbol = "cuftnaturalgas", usename = 1, utype = "energy", scale = 1055055.85262, default = "MJ", link = "Conversion of units#Energy", }, ["Eh"] = { name1 = "Hartree", symbol = "''E''<sub>h</sub>", utype = "energy", scale = 4.35974417e-18, default = "eV", }, ["erg"] = { symbol = "erg", utype = "energy", scale = 0.0000001, default = "μJ", }, ["eV"] = { name1 = "electronvolt", symbol = "eV", utype = "energy", scale = 1.602176487e-19, default = "aJ", }, ["feV"] = { name1 = "femtoelectronvolt", symbol = "feV", utype = "energy", scale = 1.602176487e-34, default = "yJ", link = "Electronvolt", }, ["foe"] = { symbol = "foe", utype = "energy", scale = 1e44, default = "YJ", link = "Foe (unit)", }, ["ftlb"] = { name1 = "foot-pound", symbol = "ft⋅lb", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftlb-f"] = { name1 = "foot-pound force", name2 = "foot-pounds force", symbol = "ft⋅lb<sub>f</sub>", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftlbf"] = { name1 = "foot-pound force", name2 = "foot-pounds force", symbol = "ft⋅lbf", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftpdl"] = { name1 = "foot-poundal", symbol = "ft⋅pdl", utype = "energy", scale = 0.0421401100938048, default = "J", }, ["GeV"] = { name1 = "gigaelectronvolt", symbol = "GeV", utype = "energy", scale = 1.602176487e-10, default = "nJ", link = "Electronvolt", }, ["gTNT"] = { name2 = "grams of TNT", symbol = "gram of TNT", usename = 1, utype = "energy", scale = 4184, default = "kJ", link = "TNT equivalent", }, ["Gtoe"] = { name1 = "gigatonne of oil equivalent", name2 = "gigatonnes of oil equivalent", symbol = "Gtoe", utype = "energy", scale = 4.1868e19, default = "EJ", link = "Tonne of oil equivalent", }, ["GtonTNT"] = { name2 = "gigatons of TNT", symbol = "gigaton of TNT", usename = 1, utype = "energy", scale = 4.184e18, default = "EJ", link = "TNT equivalent", }, ["GtTNT"] = { name2 = "gigatonnes of TNT", symbol = "gigatonne of TNT", usename = 1, utype = "energy", scale = 4.184e18, default = "EJ", link = "TNT equivalent", }, ["GW.h"] = { name1 = "gigawatt-hour", symbol = "GW⋅h", utype = "energy", scale = 3.6e12, default = "TJ", link = "Kilowatt-hour", }, ["GWh"] = { name1 = "gigawatt-hour", symbol = "GWh", utype = "energy", scale = 3.6e12, default = "TJ", link = "Kilowatt-hour", }, ["hph"] = { name1 = "horsepower-hour", symbol = "hp⋅h", utype = "energy", scale = 2684519.537696172792, default = "kWh", link = "Horsepower", }, ["inlb"] = { name1 = "inch-pound", symbol = "in⋅lb", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inlb-f"] = { name1 = "inch-pound force", name2 = "inch-pounds force", symbol = "in⋅lb<sub>f</sub>", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inlbf"] = { name1 = "inch-pound force", name2 = "inch-pounds force", symbol = "in⋅lbf", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inoz-f"] = { name1 = "inch-ounce force", name2 = "inch-ounces force", symbol = "in⋅oz<sub>f</sub>", utype = "energy", alttype = "torque", scale = 0.00706155181422604375, default = "mJ", link = "Foot-pound (energy)", }, ["inozf"] = { name1 = "inch-ounce force", name2 = "inch-ounces force", symbol = "in⋅ozf", utype = "energy", alttype = "torque", scale = 0.00706155181422604375, default = "mJ", link = "Foot-pound (energy)", }, ["J"] = { _name1 = "joule", _symbol = "J", utype = "energy", scale = 1, prefixes = 1, default = "cal", link = "Joule", }, ["kBOE"] = { name1 = "kilo barrel of oil equivalent", name2 = "kilo barrels of oil equivalent", symbol = "kBOE", utype = "energy", scale = 6.1178632e12, default = "TJ", link = "Barrel of oil equivalent", }, ["kcal"] = { name1 = "kilocalorie", symbol = "kcal", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["kcal-15"] = { name1 = "kilocalorie (15°C)", name2 = "kilocalories (15°C)", symbol = "kcal<sub>15</sub>", utype = "energy", scale = 4185.8, default = "kJ", link = "Calorie", }, ["kcal-IT"] = { name1 = "kilocalorie (International Steam Table)", name2 = "kilocalories (International Steam Table)", symbol = "kcal<sub>IT</sub>", utype = "energy", scale = 4186.8, default = "kJ", link = "Calorie", }, ["kcal-th"] = { name1 = "kilocalorie (thermochemical)", name2 = "kilocalories (thermochemical)", symbol = "kcal<sub>th</sub>", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["kerg"] = { name1 = "kiloerg", symbol = "kerg", utype = "energy", scale = 0.0001, default = "mJ", link = "Erg", }, ["keV"] = { name1 = "kiloelectronvolt", symbol = "keV", utype = "energy", scale = 1.602176487e-16, default = "fJ", link = "Electronvolt", }, ["kgTNT"] = { name2 = "kilograms of TNT", symbol = "kilogram of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["kt(TNT)"] = { name1 = "kilotonne", name1_us = "kiloton", symbol = "kt", utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["ktoe"] = { name1 = "kilotonne of oil equivalent", name2 = "kilotonnes of oil equivalent", symbol = "ktoe", utype = "energy", scale = 4.1868e13, default = "TJ", link = "Tonne of oil equivalent", }, ["ktonTNT"] = { name1 = "kiloton of TNT", name2 = "kilotons of TNT", symbol = "kt", utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["ktTNT"] = { name2 = "kilotonnes of TNT", symbol = "kilotonne of TNT", usename = 1, utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["kW.h"] = { name1 = "kilowatt-hour", symbol = "kW⋅h", utype = "energy", scale = 3600000, default = "MJ", }, ["kWh"] = { name1 = "kilowatt-hour", symbol = "kWh", utype = "energy", scale = 3600000, default = "MJ", }, ["Mcal"] = { name1 = "megacalorie", symbol = "Mcal", utype = "energy", scale = 4184000, default = "MJ", link = "Calorie", }, ["mcal"] = { name1 = "millicalorie", symbol = "mcal", utype = "energy", scale = 0.004184, default = "mJ", link = "Calorie", }, ["Mcal-15"] = { name1 = "megacalorie (15°C)", name2 = "megacalories (15°C)", symbol = "Mcal<sub>15</sub>", utype = "energy", scale = 4185800, default = "MJ", link = "Calorie", }, ["mcal-15"] = { name1 = "millicalorie (15°C)", name2 = "millicalories (15°C)", symbol = "mcal<sub>15</sub>", utype = "energy", scale = 0.0041858, default = "mJ", link = "Calorie", }, ["Mcal-IT"] = { name1 = "megacalorie (International Steam Table)", name2 = "megacalories (International Steam Table)", symbol = "Mcal<sub>IT</sub>", utype = "energy", scale = 4186800, default = "MJ", link = "Calorie", }, ["mcal-IT"] = { name1 = "millicalorie (International Steam Table)", name2 = "millicalories (International Steam Table)", symbol = "mcal<sub>IT</sub>", utype = "energy", scale = 0.0041868, default = "mJ", link = "Calorie", }, ["Mcal-th"] = { name1 = "megacalorie (thermochemical)", name2 = "megacalories (thermochemical)", symbol = "Mcal<sub>th</sub>", utype = "energy", scale = 4184000, default = "MJ", link = "Calorie", }, ["mcal-th"] = { name1 = "millicalorie (thermochemical)", name2 = "millicalories (thermochemical)", symbol = "mcal<sub>th</sub>", utype = "energy", scale = 0.004184, default = "mJ", link = "Calorie", }, ["Merg"] = { name1 = "megaerg", symbol = "Merg", utype = "energy", scale = 0.1, default = "J", link = "Erg", }, ["merg"] = { name1 = "millierg", symbol = "merg", utype = "energy", scale = 0.0000000001, default = "μJ", link = "Erg", }, ["MeV"] = { name1 = "megaelectronvolt", symbol = "MeV", utype = "energy", scale = 1.602176487e-13, default = "pJ", link = "Electronvolt", }, ["meV"] = { name1 = "millielectronvolt", symbol = "meV", utype = "energy", scale = 1.602176487e-22, default = "zJ", link = "Electronvolt", }, ["MMBtu"] = { name1 = "million British thermal units", name2 = "million British thermal units", symbol = "MMBtu", utype = "energy", scale = 1055055852.62, default = "GJ", link = "British thermal unit", }, ["Mt(TNT)"] = { name1 = "megatonne", name1_us = "megaton", symbol = "Mt", utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["Mtoe"] = { name1 = "megatonne of oil equivalent", name2 = "megatonnes of oil equivalent", symbol = "Mtoe", utype = "energy", scale = 4.1868e16, default = "PJ", link = "Tonne of oil equivalent", }, ["MtonTNT"] = { name1 = "megaton of TNT", name2 = "megatons of TNT", symbol = "Mt", utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["mtonTNT"] = { name2 = "millitons of TNT", symbol = "milliton of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["MtTNT"] = { name2 = "megatonnes of TNT", symbol = "megatonne of TNT", usename = 1, utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["mtTNT"] = { name2 = "millitonnes of TNT", symbol = "millitonne of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["MW.h"] = { name1 = "megawatt-hour", symbol = "MW⋅h", utype = "energy", scale = 3600000000, default = "GJ", link = "Kilowatt-hour", }, ["mW.h"] = { name1 = "milliwatt-hour", symbol = "mW⋅h", utype = "energy", scale = 3.6, default = "J", link = "Kilowatt-hour", }, ["MWh"] = { name1 = "megawatt-hour", symbol = "MWh", utype = "energy", scale = 3600000000, default = "GJ", link = "Kilowatt-hour", }, ["mWh"] = { name1 = "milliwatt-hour", symbol = "mWh", utype = "energy", scale = 3.6, default = "J", link = "Kilowatt-hour", }, ["neV"] = { name1 = "nanoelectronvolt", symbol = "neV", utype = "energy", scale = 1.602176487e-28, default = "yJ", link = "Electronvolt", }, ["PeV"] = { name1 = "petaelectronvolt", symbol = "PeV", utype = "energy", scale = 0.0001602176487, default = "mJ", link = "Electronvolt", }, ["peV"] = { name1 = "picoelectronvolt", symbol = "peV", utype = "energy", scale = 1.602176487e-31, default = "yJ", link = "Electronvolt", }, ["PSh"] = { name1 = "Pferdestärkenstunde", symbol = "PSh", utype = "energy", scale = 2647795.5, default = "kWh", }, ["quad"] = { name1 = "quadrillion British thermal units", name2 = "quadrillion British thermal units", symbol = "quad", utype = "energy", scale = 1.054804e18, default = "EJ", link = "Quad (unit)", }, ["Ry"] = { name1 = "rydberg", symbol = "Ry", utype = "energy", scale = 2.1798741e-18, default = "eV", link = "Rydberg constant", }, ["scf"] = { name1 = "standard cubic foot", name2 = "standard cubic feet", symbol = "scf", utype = "energy", scale = 2869.2044809344, default = "kJ", }, ["scfoot"] = { name1 = "standard cubic foot", name2 = "standard cubic foot", symbol = "scf", utype = "energy", scale = 2869.2044809344, default = "kJ", }, ["t(TNT)"] = { name1 = "tonne", name1_us = "ton", symbol = "t", utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["TeV"] = { name1 = "teraelectronvolt", symbol = "TeV", utype = "energy", scale = 1.602176487e-7, default = "μJ", link = "Electronvolt", }, ["th"] = { name1 = "thermie", symbol = "th", utype = "energy", scale = 4186800, default = "MJ", link = "Conversion of units#Energy", }, ["thm-EC"] = { name1 = "therm (EC)", name2 = "therms (EC)", symbol = "thm (EC)", utype = "energy", scale = 105506000, default = "MJ", link = "Therm", }, ["thm-UK"] = { name1 = "therm (UK)", name2 = "therms (UK)", symbol = "thm (UK)", utype = "energy", scale = 105505585.257348, default = "MJ", link = "Therm", }, ["thm-US"] = { name1 = "therm (US)", name1_us = "therm (U.S.)", name2 = "therms (US)", name2_us = "therms (U.S.)", symbol = "thm (US)", sym_us = "thm (U.S.)", utype = "energy", scale = 105480400, default = "MJ", link = "Therm", }, ["toe"] = { name1 = "tonne of oil equivalent", name2 = "tonnes of oil equivalent", symbol = "toe", utype = "energy", scale = 41868000000, default = "GJ", }, ["tonTNT"] = { name2 = "tons of TNT", symbol = "ton of TNT", usename = 1, utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["tTNT"] = { name2 = "tonnes of TNT", symbol = "tonne of TNT", usename = 1, utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["TtonTNT"] = { name2 = "teratons of TNT", symbol = "teraton of TNT", usename = 1, utype = "energy", scale = 4.184e21, default = "ZJ", link = "TNT equivalent", }, ["TtTNT"] = { name2 = "teratonnes of TNT", symbol = "teratonne of TNT", usename = 1, utype = "energy", scale = 4.184e21, default = "ZJ", link = "TNT equivalent", }, ["TW.h"] = { name1 = "terawatt-hour", symbol = "TW⋅h", utype = "energy", scale = 3.6e15, default = "PJ", link = "Kilowatt-hour", }, ["TWh"] = { name1 = "terawatt-hour", symbol = "TWh", utype = "energy", scale = 3.6e15, default = "PJ", link = "Kilowatt-hour", }, ["W.h"] = { name1 = "watt-hour", symbol = "W⋅h", utype = "energy", scale = 3600, default = "kJ", link = "Kilowatt-hour", }, ["Wh"] = { name1 = "watt-hour", symbol = "Wh", utype = "energy", scale = 3600, default = "kJ", link = "Kilowatt-hour", }, ["μerg"] = { name1 = "microerg", symbol = "μerg", utype = "energy", scale = 1e-13, default = "nJ", link = "Erg", }, ["μeV"] = { name1 = "microelectronvolt", symbol = "μeV", utype = "energy", scale = 1.602176487e-25, default = "yJ", link = "Electronvolt", }, ["μW.h"] = { name1 = "microwatt-hour", symbol = "μW⋅h", utype = "energy", scale = 0.0036, default = "mJ", link = "Kilowatt-hour", }, ["μWh"] = { name1 = "microwatt-hour", symbol = "μWh", utype = "energy", scale = 0.0036, default = "mJ", link = "Kilowatt-hour", }, ["-kW.h"] = { target = "kW.h", link = "Kilowatt hour", }, ["btu"] = { target = "BTU", }, ["Calorie"] = { target = "Cal", }, ["ft.lbf"] = { target = "ftlbf", }, ["ft·lbf"] = { target = "ftlbf", }, ["g-cal-15"] = { target = "cal-15", }, ["g-cal-IT"] = { target = "cal-IT", }, ["g-cal-th"] = { target = "cal-th", }, ["g-kcal-15"] = { target = "kcal-15", }, ["g-kcal-IT"] = { target = "kcal-IT", }, ["g-kcal-th"] = { target = "kcal-th", }, ["g-Mcal-15"] = { target = "Mcal-15", }, ["g-mcal-15"] = { target = "mcal-15", }, ["g-Mcal-IT"] = { target = "Mcal-IT", }, ["g-mcal-IT"] = { target = "mcal-IT", }, ["g-Mcal-th"] = { target = "Mcal-th", }, ["g-mcal-th"] = { target = "mcal-th", }, ["GW-h"] = { target = "GW.h", }, ["GW·h"] = { target = "GW.h", }, ["Hartree"] = { target = "Eh", }, ["hp.h"] = { target = "hph", }, ["in.lb-f"] = { target = "inlb-f", }, ["in.lbf"] = { target = "inlbf", }, ["in.oz-f"] = { target = "inoz-f", }, ["in.ozf"] = { target = "inozf", }, ["kbboe"] = { target = "kBOE", symbol = "kbboe", }, ["kg-cal-15"] = { target = "Cal-15", }, ["kg-cal-IT"] = { target = "Cal-IT", }, ["kg-cal-th"] = { target = "Cal-th", }, ["kW-h"] = { target = "kW.h", }, ["kW·h"] = { target = "kW.h", }, ["MW-h"] = { target = "MW.h", }, ["mW-h"] = { target = "mW.h", }, ["MW·h"] = { target = "MW.h", }, ["TW-h"] = { target = "TW.h", }, ["uerg"] = { target = "μerg", }, ["ueV"] = { target = "μeV", }, ["uW-h"] = { target = "μW.h", }, ["uW.h"] = { target = "μW.h", }, ["uWh"] = { target = "μWh", }, ["W-h"] = { target = "W.h", }, ["eVpar"] = { _name1 = "electronvolt", _symbol = "eV", utype = "energy per chemical amount", scale = 96485.329522144166, prefixes = 1, default = "kcal/mol", link = "Electronvolt", }, ["kcal/mol"] = { per = { "kcal", "mol" }, utype = "energy per chemical amount", default = "kJ/mol", link = "Kilocalorie per mole", }, ["kJ/mol"] = { per = { "kJ", "mol" }, utype = "energy per chemical amount", default = "kcal/mol", link = "Joule per mole", }, ["kWh/100 km"] = { name1 = "kilowatt-hour per 100 kilometres", name1_us = "kilowatt-hour per 100 kilometers", name2 = "kilowatt-hours per 100 kilometres", name2_us = "kilowatt-hours per 100 kilometers", symbol = "kW⋅h/100&nbsp;km", utype = "energy per unit length", scale = 36, default = "MJ/km kWh/mi", link = "Kilowatt-hour", }, ["kWh/100 mi"] = { name1 = "kilowatt-hour per 100 miles", name2 = "kilowatt-hours per 100 miles", symbol = "kW⋅h/100&nbsp;mi", utype = "energy per unit length", scale = 22.3694, default = "mpge", link = "Miles per gallon gasoline equivalent", }, ["MJ/100 km"] = { name1 = "megajoule per 100 kilometres", name1_us = "megajoule per 100 kilometers", name2 = "megajoules per 100 kilometres", name2_us = "megajoules per 100 kilometers", symbol = "MJ/100&nbsp;km", utype = "energy per unit length", scale = 10, default = "BTU/mi", link = "British thermal unit", }, ["mpge"] = { name1 = "mile per gallon gasoline equivalent", name2 = "miles per gallon gasoline equivalent", symbol = "mpg&#8209;e", utype = "energy per unit length", scale = 1.3263314048360777e-5, invert = -1, iscomplex= true, default = "kWh/100 mi", link = "Miles per gallon gasoline equivalent", }, ["BTU/mi"] = { per = { "BTU", "mi" }, utype = "energy per unit length", default = "v > 1525 ! M ! k ! J/km", }, ["kJ/km"] = { per = { "kJ", "km" }, utype = "energy per unit length", default = "BTU/mi", }, ["kWh/km"] = { per = { "-kW.h", "km" }, utype = "energy per unit length", default = "MJ/km kWh/mi", }, ["kWh/mi"] = { per = { "-kW.h", "mi" }, utype = "energy per unit length", default = "kWh/km MJ/km", }, ["MJ/km"] = { per = { "MJ", "km" }, utype = "energy per unit length", default = "BTU/mi", }, ["mpg-e"] = { target = "mpge", }, ["BTU/lb"] = { name1 = "British thermal unit per pound", name2 = "British thermal units per pound", symbol = "BTU/lb", utype = "energy per unit mass", scale = 2326, default = "kJ/kg", link = "British thermal unit", }, ["cal/g"] = { name1 = "calorie per gram", name2 = "calories per gram", symbol = "cal/g", utype = "energy per unit mass", scale = 4184, default = "J/g", }, ["GJ/kg"] = { name1 = "gigajoule per kilogram", name2 = "gigajoules per kilogram", symbol = "GJ/kg", utype = "energy per unit mass", scale = 1e9, default = "ktTNT/t", link = "Specific energy", }, ["J/g"] = { name1 = "joule per gram", name2 = "joules per gram", symbol = "J/g", utype = "energy per unit mass", scale = 1000, default = "kcal/g", link = "Specific energy", }, ["kcal/g"] = { name1 = "kilocalorie per gram", name2 = "kilocalories per gram", symbol = "kcal/g", utype = "energy per unit mass", scale = 4184000, default = "kJ/g", }, ["kJ/g"] = { name1 = "kilojoule per gram", name2 = "kilojoules per gram", symbol = "kJ/g", utype = "energy per unit mass", scale = 1000000, default = "kcal/g", link = "Specific energy", }, ["kJ/kg"] = { name1 = "kilojoule per kilogram", name2 = "kilojoules per kilogram", symbol = "kJ/kg", utype = "energy per unit mass", scale = 1000, default = "BTU/lb", link = "Specific energy", }, ["ktonTNT/MT"] = { name2 = "kilotons of TNT per metric ton", symbol = "kiloton of TNT per metric ton", usename = 1, utype = "energy per unit mass", scale = 4184000000, default = "GJ/kg", link = "TNT equivalent", }, ["ktTNT/t"] = { name2 = "kilotonnes of TNT per tonne", symbol = "kilotonne of TNT per tonne", usename = 1, utype = "energy per unit mass", scale = 4184000000, default = "GJ/kg", link = "TNT equivalent", }, ["MtonTNT/MT"] = { name2 = "megatons of TNT per metric ton", symbol = "megaton of TNT per metric ton", usename = 1, utype = "energy per unit mass", scale = 4.184e12, default = "TJ/kg", link = "TNT equivalent", }, ["MtTNT/MT"] = { name2 = "megatonnes of TNT per tonne", symbol = "megatonne of TNT per tonne", usename = 1, utype = "energy per unit mass", scale = 4.184e12, default = "TJ/kg", link = "TNT equivalent", }, ["TJ/kg"] = { name1 = "terajoule per kilogram", name2 = "terajoules per kilogram", symbol = "TJ/kg", utype = "energy per unit mass", scale = 1e12, default = "MtTNT/MT", link = "Specific energy", }, ["Cal/g"] = { per = { "Cal", "g" }, utype = "energy per unit mass", default = "kJ/g", }, ["BTU/cuft"] = { per = { "BTU", "cuft" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/12USoz(mL)serve"] = { per = { "Cal", "-12USoz(mL)serve" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/12USoz(ml)serve"] = { per = { "Cal", "-12USoz(ml)serve" }, utype = "energy per unit volume", default = "kJ/l", }, ["Cal/12USozserve"] = { per = { "Cal", "-12USozserve" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/USoz"] = { per = { "Cal", "USoz" }, utype = "energy per unit volume", default = "kJ/ml", }, ["kJ/L"] = { per = { "kJ", "L" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["kJ/l"] = { per = { "kJ", "ll" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["kJ/ml"] = { per = { "kJ", "ml" }, utype = "energy per unit volume", default = "Cal/USoz", }, ["MJ/m3"] = { per = { "MJ", "m3" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["Sv"] = { _name1 = "sievert", _symbol = "Sv", utype = "equivalent radiation dose", scale = 1, prefixes = 1, default = "rem", link = "Sievert", }, ["rem"] = { _name1 = "rem", _symbol = "rem", utype = "equivalent radiation dose", scale = 0.01, prefixes = 1, default = "Sv", link = "Roentgen equivalent man", }, ["g/km"] = { name1 = "gram per kilometre", name1_us = "gram per kilometer", name2 = "grams per kilometre", name2_us = "grams per kilometer", symbol = "g/km", utype = "exhaust emission", scale = 1e-6, default = "oz/mi", link = "Exhaust gas", }, ["g/mi"] = { name1 = "gram per mile", name2 = "grams per mile", symbol = "g/mi", utype = "exhaust emission", scale = 6.2137119223733397e-7, default = "g/km", link = "Exhaust gas", }, ["gCO2/km"] = { name1 = "gram of CO<sub>2</sub> per kilometre", name1_us = "gram of CO<sub>2</sub> per kilometer", name2 = "grams of CO<sub>2</sub> per kilometre", name2_us = "grams of CO<sub>2</sub> per kilometer", symbol = "g(CO<sub>2</sub>)/km", utype = "exhaust emission", scale = 1e-6, default = "ozCO2/mi", link = "Exhaust gas", }, ["gCO2/mi"] = { name1 = "gram of CO<sub>2</sub> per mile", name2 = "grams of CO<sub>2</sub> per mile", symbol = "g(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 6.2137119223733397e-7, default = "gCO2/km", link = "Exhaust gas", }, ["kg/km"] = { name1 = "kilogram per kilometre", name1_us = "kilogram per kilometer", name2 = "kilograms per kilometre", name2_us = "kilograms per kilometer", symbol = "kg/km", utype = "exhaust emission", scale = 0.001, default = "lb/mi", link = "Exhaust gas", }, ["kgCO2/km"] = { name1 = "kilogram of CO<sub>2</sub> per kilometre", name1_us = "kilogram of CO<sub>2</sub> per kilometer", name2 = "kilograms of CO<sub>2</sub> per kilometre", name2_us = "kilograms of CO<sub>2</sub> per kilometer", symbol = "kg(CO<sub>2</sub>)/km", utype = "exhaust emission", scale = 0.001, default = "lbCO2/mi", link = "Exhaust gas", }, ["lb/mi"] = { name1 = "pound per mile", name2 = "pounds per mile", symbol = "lb/mi", utype = "exhaust emission", scale = 0.00028184923173665794, default = "kg/km", link = "Exhaust gas", }, ["lbCO2/mi"] = { name1 = "pound of CO<sub>2</sub> per mile", name2 = "pounds of CO<sub>2</sub> per mile", symbol = "lb(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 0.00028184923173665794, default = "kgCO2/km", link = "Exhaust gas", }, ["oz/mi"] = { name1 = "ounce per mile", name2 = "ounces per mile", symbol = "oz/mi", utype = "exhaust emission", scale = 1.7615576983541121e-5, default = "g/km", link = "Exhaust gas", }, ["ozCO2/mi"] = { name1 = "ounce of CO<sub>2</sub> per mile", name2 = "ounces of CO<sub>2</sub> per mile", symbol = "oz(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 1.7615576983541121e-5, default = "gCO2/km", link = "Exhaust gas", }, ["cuft/a"] = { name1 = "cubic foot per annum", name2 = "cubic feet per annum", symbol = "cu&nbsp;ft/a", utype = "flow", scale = 8.9730672142368242e-10, default = "m3/a", link = "Cubic foot per second", }, ["cuft/d"] = { name1 = "cubic foot per day", name2 = "cubic feet per day", symbol = "cu&nbsp;ft/d", utype = "flow", scale = 3.2774128000000003e-7, default = "m3/d", link = "Cubic foot per second", }, ["cuft/h"] = { name1 = "cubic foot per hour", name2 = "cubic feet per hour", symbol = "cu&nbsp;ft/h", utype = "flow", scale = 7.8657907200000004e-6, default = "m3/h", link = "Cubic foot per second", }, ["cuft/min"] = { name1 = "cubic foot per minute", name2 = "cubic feet per minute", symbol = "cu&nbsp;ft/min", utype = "flow", scale = 0.00047194744319999999, default = "m3/min", }, ["cuft/s"] = { name1 = "cubic foot per second", name2 = "cubic feet per second", symbol = "cu&nbsp;ft/s", utype = "flow", scale = 28316846592e-12, default = "m3/s", }, ["cumi/a"] = { name1 = "cubic mile per annum", name2 = "cubic miles per annum", symbol = "cu&nbsp;mi/a", utype = "flow", scale = 132.08171170940057, default = "km3/a", link = "Cubic foot per second", }, ["cuyd/h"] = { name1 = "cubic yard per hour", name2 = "cubic yards per hour", symbol = "cuyd/h", utype = "flow", scale = 0.00021237634944000001, default = "m3/h", link = "Cubic foot per second", }, ["cuyd/s"] = { name1 = "cubic yard per second", name2 = "cubic yards per second", symbol = "cu&nbsp;yd/s", utype = "flow", scale = 0.76455485798400002, default = "m3/s", }, ["Goilbbl/a"] = { name1 = "billion barrels per year", name2 = "billion barrels per year", symbol = "Gbbl/a", utype = "flow", scale = 5.0380033629933836, default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3/a", link = "Barrel per day", }, ["impgal/h"] = { name1 = "imperial gallon per hour", name2 = "imperial gallons per hour", symbol = "imp&nbsp;gal/h", utype = "flow", scale = 1.2628027777777779e-6, default = "m3/h", link = "Gallon", }, ["impgal/min"] = { name1 = "imperial gallon per minute", name2 = "imperial gallons per minute", symbol = "imp gal/min", utype = "flow", scale = 7.5768166666666671e-5, default = "m3/s", link = "Gallon", }, ["impgal/s"] = { name1 = "imperial gallon per second", name2 = "imperial gallons per second", symbol = "impgal/s", utype = "flow", scale = 0.00454609, default = "m3/s", link = "Imperial gallons per second", }, ["km3/a"] = { name1 = "cubic kilometre per annum", name1_us = "cubic kilometer per annum", name2 = "cubic kilometres per annum", name2_us = "cubic kilometers per annum", symbol = "km<sup>3</sup>/a", utype = "flow", scale = 31.68808781402895, default = "cumi/a", link = "Cubic metre per second", }, ["km3/d"] = { name1 = "cubic kilometre per day", name1_us = "cubic kilometer per day", name2 = "cubic kilometres per day", name2_us = "cubic kilometers per day", symbol = "km<sup>3</sup>/d", utype = "flow", scale = 11574.074074074075, default = "cuft/d", link = "Cubic metre per second", }, ["koilbbl/a"] = { name1 = "thousand barrels per year", name2 = "thousand barrels per year", symbol = "kbbl/a", utype = "flow", scale = 5.0380033629933841e-6, default = "v * 1.58987294928 < 10 ! ! e3 ! m3/a", link = "Barrel per day", }, ["koilbbl/d"] = { name1 = "thousand barrels per day", name2 = "thousand barrels per day", symbol = "kbbl/d", utype = "flow", scale = 0.0018401307283333335, default = "v * 1.58987294928 < 10 ! ! e3 ! m3/d", link = "Barrel per day", }, ["L/h"] = { name1 = "litre per hour", name1_us = "liter per hour", name2 = "litres per hour", name2_us = "liters per hour", symbol = "L/h", utype = "flow", scale = 2.7777777777777776e-7, default = "impgal/h USgal/h", link = "Cubic metre per second", }, ["L/min"] = { name1 = "litre per minute", name1_us = "liter per minute", name2 = "litres per minute", name2_us = "liters per minute", symbol = "L/min", utype = "flow", scale = 1.6666666666666667e-5, default = "impgal/min USgal/min", link = "Cubic metre per second", }, ["L/s"] = { name1 = "litre per second", name1_us = "liter per second", name2 = "litres per second", name2_us = "liters per second", symbol = "L/s", utype = "flow", scale = 0.001, default = "cuft/s", link = "Cubic metre per second", }, ["m3/a"] = { name1 = "cubic metre per annum", name1_us = "cubic meter per annum", name2 = "cubic metres per annum", name2_us = "cubic meters per annum", symbol = "m<sup>3</sup>/a", utype = "flow", scale = 3.1688087814028947e-8, default = "cuft/a", link = "Cubic metre per second", }, ["m3/d"] = { name1 = "cubic metre per day", name1_us = "cubic meter per day", name2 = "cubic metres per day", name2_us = "cubic meters per day", symbol = "m<sup>3</sup>/d", utype = "flow", scale = 1.1574074074074073e-5, default = "cuft/d", link = "Cubic metre per second", }, ["m3/h"] = { name1 = "cubic metre per hour", name1_us = "cubic meter per hour", name2 = "cubic metres per hour", name2_us = "cubic meters per hour", symbol = "m<sup>3</sup>/h", utype = "flow", scale = 0.00027777777777777778, default = "cuft/h", link = "Cubic metre per second", }, ["m3/min"] = { name1 = "cubic metre per minute", name1_us = "cubic meter per minute", name2 = "cubic metres per minute", name2_us = "cubic meters per minute", symbol = "m<sup>3</sup>/min", utype = "flow", scale = 0.016666666666666666, default = "cuft/min", link = "Cubic metre per second", }, ["m3/s"] = { name1 = "cubic metre per second", name1_us = "cubic meter per second", name2 = "cubic metres per second", name2_us = "cubic meters per second", symbol = "m<sup>3</sup>/s", utype = "flow", scale = 1, default = "cuft/s", }, ["Moilbbl/a"] = { name1 = "million barrels per year", name2 = "million barrels per year", symbol = "Mbbl/a", utype = "flow", scale = 0.0050380033629933837, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/a", link = "Barrel per day", }, ["Moilbbl/d"] = { name1 = "million barrels per day", name2 = "million barrels per day", symbol = "Mbbl/d", utype = "flow", scale = 1.8401307283333335, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/d", link = "Barrel per day", }, ["oilbbl/a"] = { name1 = "barrel per year", name2 = "barrels per year", symbol = "bbl/a", utype = "flow", scale = 5.0380033629933841e-9, default = "m3/a", link = "Barrel per day", }, ["oilbbl/d"] = { name1 = "barrel per day", name2 = "barrels per day", symbol = "bbl/d", utype = "flow", scale = 1.8401307283333336e-6, default = "m3/d", }, ["Toilbbl/a"] = { name1 = "trillion barrels per year", name2 = "trillion barrels per year", symbol = "Tbbl/a", utype = "flow", scale = 5038.0033629933832, default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3/a", link = "Barrel per day", }, ["U.S.gal/d"] = { name1 = "U.S. gallon per day", name2 = "U.S. gallons per day", symbol = "U.S.&nbsp;gal/d", utype = "flow", scale = 4.3812636388888893e-8, default = "m3/s", customary= 1, }, ["U.S.gal/h"] = { name1 = "gallon per hour", name2 = "gallons per hour", symbol = "gal/h", utype = "flow", scale = 1.0515032733333334e-6, default = "m3/h", link = "Gallon", customary= 2, }, ["U.S.gal/min"] = { name1 = "U.S. gallon per minute", name2 = "U.S. gallons per minute", symbol = "U.S.&nbsp;gal/min", utype = "flow", scale = 6.3090196400000003e-5, default = "m3/s", link = "Gallon", }, ["USgal/a"] = { name1 = "US gallon per year", name2 = "US gallons per year", symbol = "US&nbsp;gal/a", utype = "flow", scale = 1.1995246102365199e-10, default = "m3/s", }, ["USgal/d"] = { name1 = "US gallon per day", name2 = "US gallons per day", symbol = "US&nbsp;gal/d", utype = "flow", scale = 4.3812636388888893e-8, default = "m3/s", }, ["USgal/h"] = { name1 = "gallon per hour", name2 = "gallons per hour", symbol = "gal/h", utype = "flow", scale = 1.0515032733333334e-6, default = "m3/h", link = "Gallon", customary= 1, }, ["USgal/min"] = { name1 = "US gallon per minute", name2 = "US gallons per minute", symbol = "US&nbsp;gal/min", utype = "flow", scale = 6.3090196400000003e-5, default = "m3/s", link = "Gallon", }, ["USgal/s"] = { name1 = "US gallon per second", name1_us = "U.S. gallon per second", name2 = "US gallons per second", name2_us = "U.S. gallons per second", symbol = "USgal/s", utype = "flow", scale = 0.003785411784, default = "m3/s", link = "US gallons per second", }, ["ft3/a"] = { target = "cuft/a", }, ["ft3/d"] = { target = "cuft/d", }, ["ft3/h"] = { target = "cuft/h", }, ["ft3/s"] = { target = "cuft/s", }, ["Gcuft/a"] = { target = "e9cuft/a", }, ["Gcuft/d"] = { target = "e9cuft/d", }, ["kcuft/a"] = { target = "e3cuft/a", }, ["kcuft/d"] = { target = "e3cuft/d", }, ["kcuft/s"] = { target = "e3cuft/s", }, ["Mcuft/a"] = { target = "e6cuft/a", }, ["Mcuft/d"] = { target = "e6cuft/d", }, ["Mcuft/s"] = { target = "e6cuft/s", }, ["m³/s"] = { target = "m3/s", }, ["Tcuft/a"] = { target = "e12cuft/a", }, ["Tcuft/d"] = { target = "e12cuft/d", }, ["u.s.gal/min"] = { target = "U.S.gal/min", }, ["usgal/min"] = { target = "USgal/min", }, ["-LTf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LTf", utype = "force", scale = 9964.01641818352, default = "kN", }, ["-STf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "STf", utype = "force", scale = 8896.443230521, default = "kN", }, ["dyn"] = { name1 = "dyne", symbol = "dyn", utype = "force", scale = 0.00001, default = "gr-f", }, ["g-f"] = { name1 = "gram-force", name2 = "grams-force", symbol = "g<sub>f</sub>", utype = "force", scale = 0.00980665, default = "mN oz-f", link = "Kilogram-force", }, ["gf"] = { name1 = "gram-force", name2 = "grams-force", symbol = "gf", utype = "force", scale = 0.00980665, default = "mN ozf", link = "Kilogram-force", }, ["gr-f"] = { name1 = "grain-force", name2 = "grains-force", symbol = "gr<sub>f</sub>", utype = "force", scale = 0.0006354602307515, default = "μN", link = "Pound (force)", }, ["grf"] = { name1 = "grain-force", name2 = "grains-force", symbol = "grf", utype = "force", scale = 0.0006354602307515, default = "μN", link = "Pound (force)", }, ["kdyn"] = { name1 = "kilodyne", symbol = "kdyn", utype = "force", scale = 0.01, default = "oz-f", link = "Dyne", }, ["kg-f"] = { name1 = "kilogram-force", name2 = "kilograms-force", symbol = "kg<sub>f</sub>", utype = "force", scale = 9.80665, default = "N lb-f", }, ["kgf"] = { name1 = "kilogram-force", name2 = "kilograms-force", symbol = "kgf", utype = "force", scale = 9.80665, default = "N lbf", }, ["kp"] = { name1 = "kilopond", symbol = "kp", utype = "force", scale = 9.80665, default = "N lb-f", link = "Kilogram-force", }, ["L/T-f"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "L/T<sub>f</sub>", utype = "force", scale = 9964.01641818352, default = "kN", }, ["L/Tf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "L/Tf", utype = "force", scale = 9964.01641818352, default = "kN", }, ["lb-f"] = { name1 = "pound-force", name2 = "pounds-force", symbol = "lb<sub>f</sub>", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["lbf"] = { name1 = "pound-force", name2 = "pounds-force", symbol = "lbf", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["lb(f)"] = { name1 = "pound", symbol = "lb", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["LT-f"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LT<sub>f</sub>", utype = "force", scale = 9964.01641818352, default = "kN", }, ["LTf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LTf", usename = 1, utype = "force", scale = 9964.01641818352, default = "kN", }, ["Mdyn"] = { name1 = "megadyne", symbol = "Mdyn", utype = "force", scale = 10, default = "lb-f", link = "Dyne", }, ["mdyn"] = { name1 = "millidyne", symbol = "mdyn", utype = "force", scale = 0.00000001, default = "gr-f", link = "Dyne", }, ["mg-f"] = { name1 = "milligram-force", name2 = "milligrams-force", symbol = "mg<sub>f</sub>", utype = "force", scale = 0.00000980665, default = "μN gr-f", link = "Kilogram-force", }, ["mgf"] = { name1 = "milligram-force", name2 = "milligrams-force", symbol = "mgf", utype = "force", scale = 0.00000980665, default = "μN grf", link = "Kilogram-force", }, ["Mp"] = { name1 = "megapond", symbol = "Mp", utype = "force", scale = 9806.65, default = "kN LT-f ST-f", link = "Kilogram-force", }, ["mp"] = { name1 = "millipond", symbol = "mp", utype = "force", scale = 0.00000980665, default = "μN gr-f", link = "Kilogram-force", }, ["N"] = { _name1 = "newton", _symbol = "N", utype = "force", scale = 1, prefixes = 1, default = "lb-f", link = "Newton (unit)", }, ["oz-f"] = { name1 = "ounce-force", name2 = "ounces-force", symbol = "oz<sub>f</sub>", utype = "force", scale = 0.2780138203095378125, default = "mN", link = "Pound (force)", }, ["ozf"] = { name1 = "ounce-force", name2 = "ounces-force", symbol = "ozf", utype = "force", scale = 0.2780138203095378125, default = "mN", link = "Pound (force)", }, ["p"] = { name1 = "pond", symbol = "p", utype = "force", scale = 0.00980665, default = "mN oz-f", link = "Kilogram-force", }, ["pdl"] = { name1 = "poundal", symbol = "pdl", utype = "force", scale = 0.138254954376, default = "N", }, ["S/T-f"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "S/T<sub>f</sub>", utype = "force", scale = 8896.443230521, default = "kN", }, ["S/Tf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "S/Tf", utype = "force", scale = 8896.443230521, default = "kN", }, ["ST-f"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "ST<sub>f</sub>", utype = "force", scale = 8896.443230521, default = "kN", }, ["STf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "STf", usename = 1, utype = "force", scale = 8896.443230521, default = "kN", }, ["t-f"] = { name1 = "tonne-force", name2 = "tonnes-force", symbol = "t<sub>f</sub>", utype = "force", scale = 9806.65, default = "kN LT-f ST-f", link = "Ton-force#Tonne-force", }, ["tf"] = { name1 = "tonne-force", name2 = "tonnes-force", symbol = "tf", utype = "force", scale = 9806.65, default = "kN LTf STf", link = "Ton-force#Tonne-force", }, ["dyne"] = { target = "dyn", }, ["newtons"] = { target = "N", }, ["poundal"] = { target = "pdl", }, ["tonne-force"] = { target = "tf", }, ["impgal/mi"] = { per = { "@impgal", "mi" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km USgal/mi", }, ["km/L"] = { per = { "km", "L" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "mpgimp mpgus", }, ["km/l"] = { per = { "km", "ll" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "mpgimp mpgus", }, ["L/100 km"] = { per = { "L", "100km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|L/100&nbsp;km]]", }, ["l/100 km"] = { per = { "ll", "100km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|l/100&nbsp;km]]", }, ["L/km"] = { per = { "L", "km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", }, ["l/km"] = { per = { "ll", "km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", }, ["mi/impqt"] = { per = { "mi", "impqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/U.S.qt"] = { per = { "mi", "U.S.qt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/USqt"] = { per = { "mi", "USqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/usqt"] = { per = { "mi", "usqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mpgimp"] = { per = { "mi", "@impgal" }, symbol = "mpg<sub>&#8209;imp</sub>", utype = "fuel efficiency", invert = -1, iscomplex= true, default = "L/100 km+mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[Imperial units|imp]]</sub>", }, ["mpgus"] = { per = { "mi", "+USgal" }, symbol = "mpg<sub>&#8209;US</sub>", utype = "fuel efficiency", invert = -1, iscomplex= true, default = "L/100 km+mpgimp", symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|US]]</sub>", }, ["U.S.gal/mi"] = { per = { "*U.S.gal", "mi" }, sp_us = true, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km impgal/mi", }, ["usgal/mi"] = { per = { "+USgal", "mi" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km impgal/mi", }, ["L/100km"] = { target = "L/100 km", }, ["l/100km"] = { target = "l/100 km", }, ["mpg"] = { shouldbe = "Use %{mpgus%} for miles per US gallon or %{mpgimp%} for miles per imperial gallon (not %{mpg%})", }, ["mpgU.S."] = { target = "mpgus", symbol = "mpg<sub>&#8209;U.S.</sub>", sp_us = true, symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|U.S.]]</sub>", }, ["mpgu.s."] = { target = "mpgus", symbol = "mpg<sub>&#8209;U.S.</sub>", sp_us = true, symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|U.S.]]</sub>", }, ["mpgUS"] = { target = "mpgus", }, ["USgal/mi"] = { target = "usgal/mi", }, ["kPa/m"] = { per = { "kPa", "-m-frac" }, utype = "fracture gradient", default = "psi/ft", }, ["psi/ft"] = { per = { "psi", "-ft-frac" }, utype = "fracture gradient", default = "kPa/m", }, ["cm/km"] = { name1 = "centimetre per kilometre", name1_us = "centimeter per kilometer", name2 = "centimetres per kilometre", name2_us = "centimeters per kilometer", symbol = "cm/km", utype = "gradient", scale = 0.00001, default = "ft/mi", link = "Grade (slope)", }, ["ft/mi"] = { name1 = "foot per mile", name2 = "feet per mile", symbol = "ft/mi", utype = "gradient", scale = 0.00018939393939393939, default = "v < 5.28 ! c ! ! m/km", link = "Grade (slope)", }, ["ft/nmi"] = { name1 = "foot per nautical mile", name2 = "feet per nautical mile", symbol = "ft/nmi", utype = "gradient", scale = 0.00016457883369330455, default = "v < 6.076 ! c ! ! m/km", link = "Grade (slope)", }, ["in/ft"] = { name1 = "inch per foot", name2 = "inches per foot", symbol = "in/ft", utype = "gradient", scale = 0.083333333333333329, default = "mm/m", link = "Grade (slope)", }, ["in/mi"] = { name1 = "inch per mile", name2 = "inches per mile", symbol = "in/mi", utype = "gradient", scale = 1.5782828282828283e-5, default = "v < 0.6336 ! m ! c ! m/km", link = "Grade (slope)", }, ["m/km"] = { name1 = "metre per kilometre", name1_us = "meter per kilometer", name2 = "metres per kilometre", name2_us = "meters per kilometer", symbol = "m/km", utype = "gradient", scale = 0.001, default = "ft/mi", link = "Grade (slope)", }, ["mm/km"] = { name1 = "millimetre per kilometre", name1_us = "millimeter per kilometer", name2 = "millimetres per kilometre", name2_us = "millimeters per kilometer", symbol = "mm/km", utype = "gradient", scale = 0.000001, default = "in/mi", link = "Grade (slope)", }, ["mm/m"] = { name1 = "millimetre per metre", name1_us = "millimeter per meter", name2 = "millimetres per metre", name2_us = "millimeters per meter", symbol = "mm/m", utype = "gradient", scale = 0.001, default = "in/ft", link = "Grade (slope)", }, ["admi"] = { name1 = "admiralty mile", symbol = "nmi&nbsp;(admiralty)", utype = "length", scale = 1853.184, default = "km mi", link = "Nautical mile", }, ["AU"] = { name1 = "astronomical unit", symbol = "AU", utype = "length", scale = 149597870700, default = "km mi", }, ["Brnmi"] = { name1 = "British nautical mile", symbol = "(Brit)&nbsp;nmi", utype = "length", scale = 1853.184, default = "km mi", link = "Nautical mile", }, ["bu"] = { name2 = "bu", symbol = "bu", usename = 1, utype = "length", scale = 0.0030303030303030303, default = "mm", link = "Japanese units of measurement#Length", }, ["ch"] = { name1 = "chain", symbol = "ch", utype = "length", scale = 20.1168, default = "ft m", subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } }, link = "Chain (unit)", }, ["chlk"] = { name1 = "[[Chain (unit)|chain]]", symbol = "[[Chain (unit)|ch]]", utype = "length", scale = 20.1168, default = "ft m", link = "", }, ["chain"] = { symbol = "chain", usename = 1, utype = "length", scale = 20.1168, default = "ft m", subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } }, link = "Chain (unit)", }, ["chainlk"] = { symbol = "[[Chain (unit)|chain]]", usename = 1, utype = "length", scale = 20.1168, default = "ft m", link = "", }, ["dpcm"] = { name2 = "dot/cm", symbol = "dot/cm", utype = "length", scale = 100, invert = -1, iscomplex= true, default = "dpi", link = "Dots per inch", }, ["dpi"] = { name2 = "DPI", symbol = "DPI", utype = "length", scale = 39.370078740157481, invert = -1, iscomplex= true, default = "pitch", link = "Dots per inch", }, ["fathom"] = { symbol = "fathom", usename = 1, utype = "length", scale = 1.8288, default = "ft m", }, ["foot"] = { name1 = "foot", name2 = "foot", symbol = "ft", utype = "length", scale = 0.3048, default = "m", subdivs = { ["in"] = { 12, default = "m" } }, link = "Foot (unit)", }, ["ft"] = { name1 = "foot", name2 = "feet", symbol = "ft", utype = "length", scale = 0.3048, exception= "integer_more_precision", default = "m", subdivs = { ["in"] = { 12, default = "m" } }, link = "Foot (unit)", }, ["furlong"] = { symbol = "furlong", usename = 1, utype = "length", scale = 201.168, default = "ft m", }, ["Gly"] = { name1 = "gigalight-year", symbol = "Gly", utype = "length", scale = 9.4607304725808e24, default = "Mpc", link = "Light-year#Definitions", }, ["Gpc"] = { name1 = "gigaparsec", symbol = "Gpc", utype = "length", scale = 3.0856775814671916e25, default = "Gly", link = "Parsec#Megaparsecs and gigaparsecs", }, ["hand"] = { name1 = "hand", symbol = "h", utype = "length", builtin = "hand", scale = 0.1016, iscomplex= true, default = "in cm", link = "Hand (unit)", }, ["in"] = { name1 = "inch", name2 = "inches", symbol = "in", utype = "length", scale = 0.0254, exception= "subunit_more_precision", default = "mm", }, ["inabbreviated"] = { name2 = "in", symbol = "in", utype = "length", scale = 0.0254, default = "mm", link = "Inch", }, ["kly"] = { name1 = "kilolight-year", symbol = "kly", utype = "length", scale = 9.4607304725808e18, default = "pc", link = "Light-year#Definitions", }, ["kpc"] = { name1 = "kiloparsec", symbol = "kpc", utype = "length", scale = 3.0856775814671916e19, default = "kly", link = "Parsec#Parsecs and kiloparsecs", }, ["LD"] = { name1 = "lunar distance", symbol = "LD", utype = "length", scale = 384403000, default = "km mi", link = "Lunar distance (astronomy)", }, ["league"] = { symbol = "league", usename = 1, utype = "length", scale = 4828.032, default = "km", link = "League (unit)", }, ["ly"] = { name1 = "light-year", symbol = "ly", utype = "length", scale = 9.4607304725808e15, default = "AU", }, ["m"] = { _name1 = "metre", _name1_us= "meter", _symbol = "m", utype = "length", scale = 1, prefixes = 1, default = "v > 0 and v < 3 ! ftin ! ft", link = "Metre", }, ["mi"] = { name1 = "mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", subdivs = { ["ch"] = { 80, default = "km" }, ["chlk"] = { 80, default = "km" }, ["chain"] = { 80, default = "km" }, ["chainlk"] = { 80, default = "km" }, ["ft"] = { 5280, default = "km" }, ["furlong"] = { 8, default = "km" }, ["yd"] = { 1760, default = "km" } }, }, ["mil"] = { symbol = "mil", usename = 1, utype = "length", scale = 0.0000254, default = "mm", link = "Thousandth of an inch", }, ["Mly"] = { name1 = "megalight-year", symbol = "Mly", utype = "length", scale = 9.4607304725808e21, default = "kpc", link = "Light-year#Definitions", }, ["Mpc"] = { name1 = "megaparsec", symbol = "Mpc", utype = "length", scale = 3.0856775814671916e22, default = "Mly", link = "Parsec#Megaparsecs and gigaparsecs", }, ["NM"] = { name1 = "nautical mile", symbol = "NM", utype = "length", scale = 1852, default = "km mi", }, ["nmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1852, default = "km mi", }, ["oldUKnmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1853.184, default = "km mi", }, ["oldUSnmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1853.24496, default = "km mi", }, ["pc"] = { name1 = "parsec", symbol = "pc", utype = "length", scale = 3.0856775814671916e16, default = "ly", }, ["perch"] = { name2 = "perches", symbol = "perch", usename = 1, utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["pitch"] = { name2 = "μm", symbol = "μm", utype = "length", scale = 1e-6, default = "dpi", defkey = "pitch", linkey = "pitch", link = "Dots per inch", }, ["pole"] = { symbol = "pole", usename = 1, utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["pre1954U.S.nmi"] = { name1 = "(pre-1954&nbsp;U.S.) nautical mile", symbol = "(pre&#8209;1954&nbsp;U.S.) nmi", utype = "length", scale = 1853.24496, default = "km mi", link = "Nautical mile", }, ["pre1954USnmi"] = { name1 = "(pre-1954&nbsp;US) nautical mile", name1_us = "(pre-1954&nbsp;U.S.) nautical mile", symbol = "(pre&#8209;1954&nbsp;US) nmi", sym_us = "(pre&#8209;1954&nbsp;U.S.) nmi", utype = "length", scale = 1853.24496, default = "km mi", link = "Nautical mile", }, ["rd"] = { name1 = "rod", symbol = "rd", utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["royal cubit"] = { name1 = "royal cubit", symbol = "cu", utype = "length", scale = 0.524, default = "mm", }, ["rtkm"] = { name1 = "route kilometre", name1_us = "route kilometer", symbol = "km", utype = "length", scale = 1000, default = "mi", link = "Kilometre", }, ["rtmi"] = { name1 = "route mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", link = "Mile", }, ["shaku"] = { name2 = "shaku", symbol = "shaku", usename = 1, utype = "length", scale = 0.30303030303030304, default = "m", link = "Shaku (unit)", }, ["sm"] = { name1 = "smoot", symbol = "sm", utype = "length", scale = 1.70180, default = "m", link = "Smoot (unit)", }, ["smi"] = { name1 = "statute mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", subdivs = { ["chain"] = { 80, default = "km" } }, }, ["solar radius"] = { name1 = "solar radius", name2 = "solar radii", symbol = "''R''<sub>☉</sub>", utype = "length", scale = 695700e3, default = "km", }, ["sun"] = { name2 = "sun", symbol = "sun", usename = 1, utype = "length", scale = 0.030303030303030304, default = "mm", link = "Japanese units of measurement#Length", }, ["thou"] = { name2 = "thou", symbol = "thou", usename = 1, utype = "length", scale = 0.0000254, default = "mm", link = "Thousandth of an inch", }, ["verst"] = { symbol = "verst", usename = 1, utype = "length", scale = 1066.8, default = "km mi", }, ["yd"] = { name1 = "yard", symbol = "yd", utype = "length", scale = 0.9144, default = "m", subdivs = { ["ft"] = { 3, default = "m" } }, }, ["μin"] = { name1 = "microinch", name2 = "microinches", symbol = "μin", utype = "length", scale = 0.0000000254, default = "nm", link = "SI prefix#Non-metric units", }, ["Å"] = { name1 = "ångström", symbol = "Å", utype = "length", scale = 0.0000000001, default = "in", }, ["Hz"] = { _name1 = "hertz", _name2 = "hertz", _symbol = "Hz", utype = "length", scale = 3.3356409519815204e-9, invert = -1, iscomplex= true, prefixes = 1, default = "m", link = "Hertz", }, ["rpm"] = { name1 = "revolution per minute", name2 = "revolutions per minute", symbol = "rpm", utype = "length", scale = 5.5594015866358675e-11, invert = -1, iscomplex= true, default = "Hz", link = "Revolutions per minute", }, ["-ft-frac"] = { target = "ft", link = "Fracture gradient", }, ["-in-stiff"] = { target = "in", link = "Stiffness", }, ["-m-frac"] = { target = "m", link = "Fracture gradient", }, ["-m-stiff"] = { target = "m", link = "Stiffness", }, ["100km"] = { target = "km", multiplier= 100, }, ["100mi"] = { target = "mi", multiplier= 100, }, ["100miles"] = { target = "mi", symbol = "miles", multiplier= 100, }, ["admiralty nmi"] = { target = "oldUKnmi", }, ["angstrom"] = { target = "Å", }, ["au"] = { target = "AU", symbol = "au", }, ["feet"] = { target = "ft", }, ["hands"] = { target = "hand", }, ["inch"] = { target = "in", }, ["inches"] = { target = "in", }, ["light-year"] = { target = "ly", }, ["meter"] = { target = "m", sp_us = true, }, ["meters"] = { target = "m", sp_us = true, }, ["metre"] = { target = "m", }, ["metres"] = { target = "m", }, ["micrometre"] = { target = "μm", }, ["micron"] = { target = "μm", default = "μin", }, ["mile"] = { target = "mi", usename = 1, }, ["miles"] = { target = "mi", usename = 1, }, ["parsec"] = { target = "pc", }, ["rod"] = { target = "rd", }, ["smoot"] = { target = "sm", }, ["uin"] = { target = "μin", }, ["yard"] = { target = "yd", }, ["yards"] = { target = "yd", }, ["yds"] = { target = "yd", }, ["dtex"] = { name1 = "decitex", name2 = "decitex", symbol = "dtex", utype = "linear density", scale = 1e-7, default = "lb/yd", link = "Units of textile measurement#Units", }, ["kg/cm"] = { name1 = "kilogram per centimetre", name1_us = "kilogram per centimeter", name2 = "kilograms per centimetre", name2_us = "kilograms per centimeter", symbol = "kg/cm", utype = "linear density", scale = 100, default = "lb/yd", link = "Linear density", }, ["kg/m"] = { name1 = "kilogram per metre", name1_us = "kilogram per meter", name2 = "kilograms per metre", name2_us = "kilograms per meter", symbol = "kg/m", utype = "linear density", scale = 1, default = "lb/yd", link = "Linear density", }, ["lb/ft"] = { name1 = "pound per foot", name2 = "pounds per foot", symbol = "lb/ft", utype = "linear density", scale = 1.4881639435695539, default = "kg/m", link = "Linear density", }, ["lb/yd"] = { name1 = "pound per yard", name2 = "pounds per yard", symbol = "lb/yd", utype = "linear density", scale = 0.49605464785651798, default = "kg/m", link = "Linear density", }, ["G"] = { _name1 = "gauss", _name2 = "gauss", _symbol = "G", utype = "magnetic field strength", scale = 0.0001, prefixes = 1, default = "T", link = "Gauss (unit)", }, ["T"] = { _name1 = "tesla", _symbol = "T", utype = "magnetic field strength", scale = 1, prefixes = 1, default = "G", link = "Tesla (unit)", }, ["A/m"] = { name1 = "ampere per metre", name1_us = "ampere per meter", name2 = "amperes per metre", name2_us = "amperes per meter", symbol = "A/m", utype = "magnetizing field", scale = 1, default = "Oe", }, ["kA/m"] = { name1 = "kiloampere per metre", name1_us = "kiloampere per meter", name2 = "kiloamperes per metre", name2_us = "kiloamperes per meter", symbol = "kA/m", utype = "magnetizing field", scale = 1000, default = "kOe", link = "Ampere per metre", }, ["MA/m"] = { name1 = "megaampere per metre", name1_us = "megaampere per meter", name2 = "megaamperes per metre", name2_us = "megaamperes per meter", symbol = "MA/m", utype = "magnetizing field", scale = 1e6, default = "kOe", link = "Ampere per metre", }, ["Oe"] = { _name1 = "oersted", _symbol = "Oe", utype = "magnetizing field", scale = 79.5774715, prefixes = 1, default = "kA/m", link = "Oersted", }, ["-Lcwt"] = { name1 = "hundredweight", name2 = "hundredweight", symbol = "cwt", utype = "mass", scale = 50.80234544, default = "lb", }, ["-Scwt"] = { name1 = "hundredweight", name2 = "hundredweight", symbol = "cwt", utype = "mass", scale = 45.359237, default = "lb", }, ["-ST"] = { name1 = "short ton", symbol = "ST", utype = "mass", scale = 907.18474, default = "t", }, ["carat"] = { symbol = "carat", usename = 1, utype = "mass", scale = 0.0002, default = "g", link = "Carat (mass)", }, ["drachm"] = { name1_us = "dram", symbol = "drachm", usename = 1, utype = "mass", scale = 0.001771845195, default = "g", link = "Dram (unit)", }, ["dram"] = { target = "drachm", }, ["dwt"] = { name1 = "pennyweight", symbol = "dwt", utype = "mass", scale = 0.00155517384, default = "oz g", }, ["DWton"] = { symbol = "deadweight ton", usename = 1, utype = "mass", scale = 1016.0469088, default = "DWtonne", link = "Deadweight tonnage", }, ["DWtonne"] = { name1_us = "deadweight metric ton", symbol = "deadweight tonne", sym_us = "~deadweight metric ton", usename = 1, utype = "mass", scale = 1000, default = "DWton", link = "Deadweight tonnage", }, ["g"] = { _name1 = "gram", _symbol = "g", utype = "mass", scale = 0.001, prefixes = 1, default = "oz", link = "Gram", }, ["gr"] = { name1 = "grain", symbol = "gr", utype = "mass", scale = 0.00006479891, default = "g", link = "Grain (unit)", }, ["Gt"] = { name1 = "gigatonne", symbol = "Gt", utype = "mass", scale = 1000000000000, default = "LT ST", link = "Tonne", }, ["impgalh2o"] = { name1 = "imperial gallon of water", name2 = "imperial gallons of water", symbol = "imp&nbsp;gal H<sub>2</sub>O", utype = "mass", scale = 4.5359236999999499, default = "lb kg", link = "Imperial gallon", }, ["kt"] = { name1 = "kilotonne", symbol = "kt", utype = "mass", scale = 1000000, default = "LT ST", link = "Tonne", }, ["lb"] = { name1 = "pound", symbol = "lb", utype = "mass", scale = 0.45359237, exception= "integer_more_precision", default = "kg", subdivs = { ["oz"] = { 16, default = "kg" } }, link = "Pound (mass)", }, ["Lcwt"] = { name1 = "long hundredweight", name2 = "long hundredweight", symbol = "Lcwt", usename = 1, utype = "mass", scale = 50.80234544, default = "lb", subdivs = { ["qtr"] = { 4, default = "kg" }, ["st"] = { 8, default = "kg" } }, link = "Hundredweight", }, ["long cwt"] = { name1 = "long hundredweight", name2 = "long hundredweight", symbol = "long&nbsp;cwt", utype = "mass", scale = 50.80234544, default = "lb kg", subdivs = { ["qtr"] = { 4, default = "kg" } }, link = "Hundredweight", }, ["long qtr"] = { name1 = "long quarter", symbol = "long&nbsp;qtr", utype = "mass", scale = 12.70058636, default = "lb kg", }, ["LT"] = { symbol = "long ton", usename = 1, utype = "mass", scale = 1016.0469088, default = "t", subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } }, }, ["lt"] = { name1 = "long ton", symbol = "LT", utype = "mass", scale = 1016.0469088, default = "t", subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } }, }, ["metric ton"] = { symbol = "metric ton", usename = 1, utype = "mass", scale = 1000, default = "long ton", link = "Tonne", }, ["MT"] = { name1 = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "LT ST", link = "Tonne", }, ["Mt"] = { name1 = "megatonne", symbol = "Mt", utype = "mass", scale = 1000000000, default = "LT ST", link = "Tonne", }, ["oz"] = { name1 = "ounce", symbol = "oz", utype = "mass", scale = 0.028349523125, default = "g", }, ["ozt"] = { name1 = "troy ounce", symbol = "ozt", utype = "mass", scale = 0.0311034768, default = "oz g", }, ["pdr"] = { name1 = "pounder", symbol = "pdr", utype = "mass", scale = 0.45359237, default = "kg", link = "Pound (mass)", }, ["qtr"] = { name1 = "quarter", symbol = "qtr", utype = "mass", scale = 12.70058636, default = "lb kg", subdivs = { ["lb"] = { 28, default = "kg" } }, link = "Long quarter", }, ["Scwt"] = { name1 = "short hundredweight", name2 = "short hundredweight", symbol = "Scwt", usename = 1, utype = "mass", scale = 45.359237, default = "lb", link = "Hundredweight", }, ["short cwt"] = { name1 = "short hundredweight", name2 = "short hundredweight", symbol = "short&nbsp;cwt", utype = "mass", scale = 45.359237, default = "lb kg", link = "Hundredweight", }, ["short qtr"] = { name1 = "short quarter", symbol = "short&nbsp;qtr", utype = "mass", scale = 11.33980925, default = "lb kg", }, ["ST"] = { symbol = "short ton", usename = 1, utype = "mass", scale = 907.18474, default = "t", subdivs = { ["Scwt"] = { 20, default = "t", unit = "-Scwt" } }, }, ["shtn"] = { name1 = "short ton", symbol = "sh&nbsp;tn", utype = "mass", scale = 907.18474, default = "t", }, ["shton"] = { symbol = "ton", usename = 1, utype = "mass", scale = 907.18474, default = "t", }, ["solar mass"] = { name1 = "solar mass", name2 = "solar masses", symbol = "''M''<sub>☉</sub>", utype = "mass", scale = 1.98855e30, default = "kg", }, ["st"] = { name1 = "stone", name2 = "stone", symbol = "st", utype = "mass", scale = 6.35029318, default = "lb kg", subdivs = { ["lb"] = { 14, default = "kg lb" } }, link = "Stone (unit)", }, ["t"] = { name1 = "tonne", name1_us = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "LT ST", }, ["tonne"] = { name1 = "tonne", name1_us = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "shton", }, ["troy pound"] = { symbol = "troy pound", usename = 1, utype = "mass", scale = 0.3732417216, default = "lb kg", link = "Troy weight", }, ["usgalh2o"] = { name1 = "US gallon of water", name1_us = "U.S. gallon of water", name2 = "US gallons of water", name2_us = "U.S. gallons of water", symbol = "US&nbsp;gal H<sub>2</sub>O", utype = "mass", scale = 3.7776215836051126, default = "lb kg", link = "United States customary units#Fluid volume", }, ["viss"] = { name2 = "viss", symbol = "viss", utype = "mass", scale = 1.632932532, default = "kg", link = "Myanmar units of measurement#Mass", }, ["billion tonne"] = { target = "e9t", }, ["kilogram"] = { target = "kg", }, ["kilotonne"] = { target = "kt", }, ["lbs"] = { target = "lb", }, ["lbt"] = { target = "troy pound", }, ["lcwt"] = { target = "Lcwt", }, ["long ton"] = { target = "LT", }, ["mcg"] = { target = "μg", }, ["million tonne"] = { target = "e6t", }, ["scwt"] = { target = "Scwt", }, ["short ton"] = { target = "ST", }, ["stone"] = { target = "st", }, ["thousand tonne"] = { target = "e3t", }, ["tonnes"] = { target = "t", }, ["kg/kW"] = { name1 = "kilogram per kilowatt", name2 = "kilograms per kilowatt", symbol = "kg/kW", utype = "mass per unit power", scale = 0.001, default = "lb/hp", link = "Kilowatt", }, ["lb/hp"] = { name1 = "pound per horsepower", name2 = "pounds per horsepower", symbol = "lb/hp", utype = "mass per unit power", scale = 0.00060827738784176115, default = "kg/kW", link = "Horsepower", }, ["kg/h"] = { per = { "kg", "h" }, utype = "mass per unit time", default = "lb/h", }, ["lb/h"] = { per = { "lb", "h" }, utype = "mass per unit time", default = "kg/h", }, ["g-mol/d"] = { name1 = "gram-mole per day", name2 = "gram-moles per day", symbol = "g&#8209;mol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["g-mol/h"] = { name1 = "gram-mole per hour", name2 = "gram-moles per hour", symbol = "g&#8209;mol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["g-mol/min"] = { name1 = "gram-mole per minute", name2 = "gram-moles per minute", symbol = "g&#8209;mol/min", utype = "molar rate", scale = 0.016666666666666666, default = "g-mol/s", link = "Mole (unit)", }, ["g-mol/s"] = { name1 = "gram-mole per second", name2 = "gram-moles per second", symbol = "g&#8209;mol/s", utype = "molar rate", scale = 1, default = "lb-mol/min", link = "Mole (unit)", }, ["gmol/d"] = { name1 = "gram-mole per day", name2 = "gram-moles per day", symbol = "gmol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["gmol/h"] = { name1 = "gram-mole per hour", name2 = "gram-moles per hour", symbol = "gmol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["gmol/min"] = { name1 = "gram-mole per minute", name2 = "gram-moles per minute", symbol = "gmol/min", utype = "molar rate", scale = 0.016666666666666666, default = "gmol/s", link = "Mole (unit)", }, ["gmol/s"] = { name1 = "gram-mole per second", name2 = "gram-moles per second", symbol = "gmol/s", utype = "molar rate", scale = 1, default = "lbmol/min", link = "Mole (unit)", }, ["kmol/d"] = { name1 = "kilomole per day", name2 = "kilomoles per day", symbol = "kmol/d", utype = "molar rate", scale = 0.011574074074074073, default = "mmol/s", link = "Mole (unit)", }, ["kmol/h"] = { name1 = "kilomole per hour", name2 = "kilomoles per hour", symbol = "kmol/h", utype = "molar rate", scale = 0.27777777777777779, default = "mol/s", link = "Mole (unit)", }, ["kmol/min"] = { name1 = "kilomole per minute", name2 = "kilomoles per minute", symbol = "kmol/min", utype = "molar rate", scale = 16.666666666666668, default = "mol/s", link = "Kilomole (unit)", }, ["kmol/s"] = { name1 = "kilomole per second", name2 = "kilomoles per second", symbol = "kmol/s", utype = "molar rate", scale = 1000, default = "lb-mol/s", link = "Mole (unit)", }, ["lb-mol/d"] = { name1 = "pound-mole per day", name2 = "pound-moles per day", symbol = "lb&#8209;mol/d", utype = "molar rate", scale = 0.0052499116898148141, default = "mmol/s", link = "Pound-mole", }, ["lb-mol/h"] = { name1 = "pound-mole per hour", name2 = "pound-moles per hour", symbol = "lb&#8209;mol/h", utype = "molar rate", scale = 0.12599788055555555, default = "mol/s", link = "Pound-mole", }, ["lb-mol/min"] = { name1 = "pound-mole per minute", name2 = "pound-moles per minute", symbol = "lb&#8209;mol/min", utype = "molar rate", scale = 7.5598728333333334, default = "mol/s", link = "Pound-mole", }, ["lb-mol/s"] = { name1 = "pound-mole per second", name2 = "pound-moles per second", symbol = "lb&#8209;mol/s", utype = "molar rate", scale = 453.59237, default = "kmol/s", link = "Pound-mole", }, ["lbmol/d"] = { name1 = "pound-mole per day", name2 = "pound-moles per day", symbol = "lbmol/d", utype = "molar rate", scale = 0.0052499116898148141, default = "mmol/s", link = "Pound-mole", }, ["lbmol/h"] = { name1 = "pound-mole per hour", name2 = "pound-moles per hour", symbol = "lbmol/h", utype = "molar rate", scale = 0.12599788055555555, default = "mol/s", link = "Pound-mole", }, ["lbmol/min"] = { name1 = "pound-mole per minute", name2 = "pound-moles per minute", symbol = "lbmol/min", utype = "molar rate", scale = 7.5598728333333334, default = "mol/s", link = "Pound-mole", }, ["lbmol/s"] = { name1 = "pound-mole per second", name2 = "pound-moles per second", symbol = "lbmol/s", utype = "molar rate", scale = 453.59237, default = "kmol/s", link = "Pound-mole", }, ["mmol/s"] = { name1 = "millimole per second", name2 = "millimoles per second", symbol = "mmol/s", utype = "molar rate", scale = 0.001, default = "lb-mol/d", link = "Mole (unit)", }, ["mol/d"] = { name1 = "mole per day", name2 = "moles per day", symbol = "mol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["mol/h"] = { name1 = "mole per hour", name2 = "moles per hour", symbol = "mol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["mol/min"] = { name1 = "mole per minute", name2 = "moles per minute", symbol = "mol/min", utype = "molar rate", scale = 0.016666666666666666, default = "mol/s", link = "Mole (unit)", }, ["mol/s"] = { name1 = "mole per second", name2 = "moles per second", symbol = "mol/s", utype = "molar rate", scale = 1, default = "lb-mol/min", link = "Mole (unit)", }, ["μmol/s"] = { name1 = "micromole per second", name2 = "micromoles per second", symbol = "μmol/s", utype = "molar rate", scale = 0.000001, default = "lb-mol/d", link = "Mole (unit)", }, ["umol/s"] = { target = "μmol/s", }, ["/acre"] = { name1 = "per acre", name2 = "per acre", symbol = "/acre", utype = "per unit area", scale = 0.00024710538146716532, default = "/ha", link = "Acre", }, ["/ha"] = { name1 = "per hectare", name2 = "per hectare", symbol = "/ha", utype = "per unit area", scale = 100e-6, default = "/acre", link = "Hectare", }, ["/sqcm"] = { name1 = "per square centimetre", name1_us = "per square centimeter", name2 = "per square centimetre", name2_us = "per square centimeter", symbol = "/cm<sup>2</sup>", utype = "per unit area", scale = 1e4, default = "/sqin", link = "Square centimetre", }, ["/sqin"] = { name1 = "per square inch", name2 = "per square inch", symbol = "/in<sup>2</sup>", utype = "per unit area", scale = 1550.0031000062002, default = "/sqcm", link = "Square inch", }, ["/sqkm"] = { name1 = "per square kilometre", name1_us = "per square kilometer", name2 = "per square kilometre", name2_us = "per square kilometer", symbol = "/km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "/sqmi", link = "Square kilometre", }, ["/sqmi"] = { name1 = "per square mile", name2 = "per square mile", symbol = "/sq&nbsp;mi", utype = "per unit area", scale = 3.8610215854244582e-7, default = "/sqkm", link = "Square mile", }, ["PD/acre"] = { name1 = "inhabitant per acre", name2 = "inhabitants per acre", symbol = "/acre", utype = "per unit area", scale = 0.00024710538146716532, default = "PD/ha", link = "Acre", }, ["PD/ha"] = { name1 = "inhabitant per hectare", name2 = "inhabitants per hectare", symbol = "/ha", utype = "per unit area", scale = 100e-6, default = "PD/acre", link = "Hectare", }, ["PD/sqkm"] = { name1 = "inhabitant per square kilometre", name1_us = "inhabitant per square kilometer", name2 = "inhabitants per square kilometre", name2_us = "inhabitants per square kilometer", symbol = "/km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "PD/sqmi", link = "Square kilometre", }, ["PD/sqmi"] = { name1 = "inhabitant per square mile", name2 = "inhabitants per square mile", symbol = "/sq&nbsp;mi", utype = "per unit area", scale = 3.8610215854244582e-7, default = "PD/sqkm", link = "Square mile", }, ["/cm2"] = { target = "/sqcm", }, ["/in2"] = { target = "/sqin", }, ["/km2"] = { target = "/sqkm", }, ["pd/acre"] = { target = "PD/acre", }, ["pd/ha"] = { target = "PD/ha", }, ["PD/km2"] = { target = "PD/sqkm", }, ["pd/km2"] = { target = "PD/sqkm", }, ["PD/km²"] = { target = "PD/sqkm", }, ["pd/sqkm"] = { target = "PD/sqkm", }, ["pd/sqmi"] = { target = "PD/sqmi", }, ["/l"] = { name1 = "per litre", name1_us = "per liter", name2 = "per litre", name2_us = "per liter", symbol = "/l", utype = "per unit volume", scale = 1000, default = "/usgal", link = "Litre", }, ["/L"] = { name1 = "per litre", name1_us = "per liter", name2 = "per litre", name2_us = "per liter", symbol = "/L", utype = "per unit volume", scale = 1000, default = "/usgal", link = "Litre", }, ["/USgal"] = { name1 = "per gallon", name2 = "per gallon", symbol = "/gal", utype = "per unit volume", scale = 264.172052, default = "/L", link = "US gallon", customary= 2, }, ["/usgal"] = { target = "/USgal", }, ["bhp"] = { name1 = "brake horsepower", name2 = "brake horsepower", symbol = "bhp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Brake horsepower", }, ["Cal/d"] = { name1 = "large calorie per day", name2 = "large calories per day", symbol = "Cal/d", utype = "power", scale = 0.048425925925925928, default = "kJ/d", link = "Calorie", }, ["Cal/h"] = { name1 = "large calorie per hour", name2 = "large calories per hour", symbol = "Cal/h", utype = "power", scale = 1.1622222222222223, default = "kJ/h", link = "Calorie", }, ["cal/h"] = { name1 = "calorie per hour", name2 = "calories per hour", symbol = "cal/h", utype = "power", scale = 0.0011622222222222223, default = "W", link = "Calorie", }, ["CV"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "CV", utype = "power", scale = 735.49875, default = "kW", }, ["hk"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "hk", utype = "power", scale = 735.49875, default = "kW", }, ["hp"] = { name1 = "horsepower", name2 = "horsepower", symbol = "hp", utype = "power", scale = 745.69987158227022, default = "kW", }, ["hp-electric"] = { name1 = "electric horsepower", name2 = "electric horsepower", symbol = "hp", utype = "power", scale = 746, default = "kW", link = "Horsepower#Electrical horsepower", }, ["hp-electrical"] = { name1 = "electrical horsepower", name2 = "electrical horsepower", symbol = "hp", utype = "power", scale = 746, default = "kW", link = "Horsepower#Electrical horsepower", }, ["hp-metric"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "hp", utype = "power", scale = 735.49875, default = "kW", }, ["ihp"] = { name1 = "indicated horsepower", name2 = "indicated horsepower", symbol = "ihp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Indicated horsepower", }, ["kcal/h"] = { name1 = "kilocalorie per hour", name2 = "kilocalories per hour", symbol = "kcal/h", utype = "power", scale = 1.1622222222222223, default = "kW", link = "Calorie", }, ["kJ/d"] = { name1 = "kilojoule per day", name2 = "kilojoules per day", symbol = "kJ/d", utype = "power", scale = 0.011574074074074073, default = "Cal/d", link = "Kilojoule", }, ["kJ/h"] = { name1 = "kilojoule per hour", name2 = "kilojoules per hour", symbol = "kJ/h", utype = "power", scale = 0.27777777777777779, default = "W", link = "Kilojoule", }, ["PS"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "PS", utype = "power", scale = 735.49875, default = "kW", }, ["shp"] = { name1 = "shaft horsepower", name2 = "shaft horsepower", symbol = "shp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Shaft horsepower", }, ["W"] = { _name1 = "watt", _symbol = "W", utype = "power", scale = 1, prefixes = 1, default = "hp", link = "Watt", }, ["BTU/h"] = { per = { "BTU", "h" }, utype = "power", default = "W", }, ["Btu/h"] = { per = { "Btu", "h" }, utype = "power", default = "W", }, ["BHP"] = { target = "bhp", }, ["btu/h"] = { target = "BTU/h", }, ["HP"] = { target = "hp", }, ["Hp"] = { target = "hp", }, ["hp-mechanical"] = { target = "hp", }, ["IHP"] = { target = "ihp", }, ["SHP"] = { target = "shp", }, ["whp"] = { target = "hp", }, ["hp/lb"] = { name1 = "horsepower per pound", name2 = "horsepower per pound", symbol = "hp/lb", utype = "power per unit mass", scale = 1643.986806, default = "kW/kg", link = "Power-to-weight ratio", }, ["hp/LT"] = { name1 = "horsepower per long ton", name2 = "horsepower per long ton", symbol = "hp/LT", utype = "power per unit mass", scale = 0.73392268125000004, default = "kW/t", link = "Power-to-weight ratio", }, ["hp/ST"] = { name1 = "horsepower per short ton", name2 = "horsepower per short ton", symbol = "hp/ST", utype = "power per unit mass", scale = 0.821993403, default = "kW/t", link = "Power-to-weight ratio", }, ["hp/t"] = { name1 = "horsepower per tonne", name2 = "horsepower per tonne", symbol = "hp/t", utype = "power per unit mass", scale = 0.74569987158227022, default = "kW/t", link = "Power-to-weight ratio", }, ["kW/kg"] = { name1 = "kilowatt per kilogram", name2 = "kilowatts per kilogram", symbol = "kW/kg", utype = "power per unit mass", scale = 1000, default = "hp/lb", link = "Power-to-weight ratio", }, ["kW/t"] = { name1 = "kilowatt per tonne", name2 = "kilowatts per tonne", symbol = "kW/t", utype = "power per unit mass", scale = 1, default = "PS/t", link = "Power-to-weight ratio", }, ["PS/t"] = { name1 = "metric horsepower per tonne", name2 = "metric horsepower per tonne", symbol = "PS/t", utype = "power per unit mass", scale = 0.73549875, default = "kW/t", link = "Power-to-weight ratio", }, ["shp/lb"] = { name1 = "shaft horsepower per pound", name2 = "shaft horsepower per pound", symbol = "shp/lb", utype = "power per unit mass", scale = 1643.986806, default = "kW/kg", link = "Power-to-weight ratio", }, ["hp/tonne"] = { target = "hp/t", symbol = "hp/tonne", default = "kW/tonne", }, ["kW/tonne"] = { target = "kW/t", symbol = "kW/tonne", }, ["-lb/in2"] = { name1 = "pound per square inch", name2 = "pounds per square inch", symbol = "lb/in<sup>2</sup>", utype = "pressure", scale = 6894.7572931683608, default = "kPa kgf/cm2", }, ["atm"] = { name1 = "standard atmosphere", symbol = "atm", utype = "pressure", scale = 101325, default = "kPa", link = "Atmosphere (unit)", }, ["Ba"] = { name1 = "barye", symbol = "Ba", utype = "pressure", scale = 0.1, default = "Pa", }, ["bar"] = { symbol = "bar", utype = "pressure", scale = 100000, default = "kPa", link = "Bar (unit)", }, ["dbar"] = { name1 = "decibar", symbol = "dbar", utype = "pressure", scale = 10000, default = "kPa", link = "Bar (unit)", }, ["inHg"] = { name1 = "inch of mercury", name2 = "inches of mercury", symbol = "inHg", utype = "pressure", scale = 3386.388640341, default = "kPa", }, ["kBa"] = { name1 = "kilobarye", symbol = "kBa", utype = "pressure", scale = 100, default = "hPa", link = "Barye", }, ["kg-f/cm2"] = { name1 = "kilogram-force per square centimetre", name1_us = "kilogram-force per square centimeter", name2 = "kilograms-force per square centimetre", name2_us = "kilograms-force per square centimeter", symbol = "kg<sub>f</sub>/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["kg/cm2"] = { name1 = "kilogram per square centimetre", name1_us = "kilogram per square centimeter", name2 = "kilograms per square centimetre", name2_us = "kilograms per square centimeter", symbol = "kg/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["kgf/cm2"] = { name1 = "kilogram-force per square centimetre", name1_us = "kilogram-force per square centimeter", name2 = "kilograms-force per square centimetre", name2_us = "kilograms-force per square centimeter", symbol = "kgf/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["ksi"] = { name1 = "kilopound per square inch", name2 = "kilopounds per square inch", symbol = "ksi", utype = "pressure", scale = 6894757.2931683613, default = "MPa", link = "Pound per square inch", }, ["lbf/in2"] = { name1 = "pound-force per square inch", name2 = "pounds-force per square inch", symbol = "lbf/in<sup>2</sup>", utype = "pressure", scale = 6894.7572931683608, default = "kPa kgf/cm2", }, ["mb"] = { name1 = "millibar", symbol = "mb", utype = "pressure", scale = 100, default = "hPa", link = "Bar (unit)", }, ["mbar"] = { name1 = "millibar", symbol = "mbar", utype = "pressure", scale = 100, default = "hPa", link = "Bar (unit)", }, ["mmHg"] = { name1 = "millimetre of mercury", name1_us = "millimeter of mercury", name2 = "millimetres of mercury", name2_us = "millimeters of mercury", symbol = "mmHg", utype = "pressure", scale = 133.322387415, default = "kPa", }, ["Pa"] = { _name1 = "pascal", _symbol = "Pa", utype = "pressure", scale = 1, prefixes = 1, default = "psi", link = "Pascal (unit)", }, ["psf"] = { name1 = "pound per square foot", name2 = "pounds per square foot", symbol = "psf", utype = "pressure", scale = 47.880258980335839, default = "kPa", link = "Pound per square inch", }, ["psi"] = { name1 = "pound per square inch", name2 = "pounds per square inch", symbol = "psi", utype = "pressure", scale = 6894.7572931683608, default = "kPa", }, ["Torr"] = { name1 = "torr", symbol = "Torr", utype = "pressure", scale = 133.32236842105263, default = "kPa", }, ["N/cm2"] = { per = { "N", "cm2" }, utype = "pressure", default = "psi", }, ["N/m2"] = { per = { "N", "m2" }, utype = "pressure", default = "psi", }, ["g/cm2"] = { per = { "g", "cm2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["g/m2"] = { per = { "g", "m2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["kg/ha"] = { per = { "kg", "ha" }, utype = "pressure", default = "lb/acre", multiplier= 9.80665, }, ["kg/m2"] = { per = { "kg", "m2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["lb/1000sqft"] = { per = { "lb", "1000sqft" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["lb/acre"] = { per = { "lb", "acre" }, utype = "pressure", default = "kg/ha", multiplier= 9.80665, }, ["lb/sqft"] = { per = { "lb", "sqft" }, utype = "pressure", default = "kg/m2", multiplier= 9.80665, }, ["lb/sqyd"] = { per = { "lb", "sqyd" }, utype = "pressure", default = "kg/m2", multiplier= 9.80665, }, ["LT/acre"] = { per = { "LT", "acre" }, utype = "pressure", default = "t/ha", multiplier= 9.80665, }, ["MT/ha"] = { per = { "MT", "ha" }, utype = "pressure", default = "LT/acre ST/acre", multiplier= 9.80665, }, ["oz/sqft"] = { per = { "oz", "sqft" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["oz/sqyd"] = { per = { "oz", "sqyd" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["ST/acre"] = { per = { "ST", "acre" }, utype = "pressure", default = "t/ha", multiplier= 9.80665, }, ["t/ha"] = { per = { "t", "ha" }, utype = "pressure", default = "LT/acre ST/acre", multiplier= 9.80665, }, ["tonne/acre"] = { per = { "tonne", "acre" }, utype = "pressure", default = "tonne/ha", multiplier= 9.80665, }, ["tonne/ha"] = { per = { "tonne", "ha" }, utype = "pressure", default = "tonne/acre", multiplier= 9.80665, }, ["kgfpsqcm"] = { target = "kgf/cm2", }, ["kgpsqcm"] = { target = "kg/cm2", }, ["kN/m2"] = { target = "kPa", }, ["lb/in2"] = { target = "lbf/in2", }, ["torr"] = { target = "Torr", }, ["Bq"] = { _name1 = "becquerel", _symbol = "Bq", utype = "radioactivity", scale = 1, prefixes = 1, default = "pCi", link = "Becquerel", }, ["Ci"] = { _name1 = "curie", _symbol = "Ci", utype = "radioactivity", scale = 3.7e10, prefixes = 1, default = "GBq", link = "Curie (unit)", }, ["Rd"] = { _name1 = "rutherford", _symbol = "Rd", utype = "radioactivity", scale = 1e6, prefixes = 1, default = "MBq", link = "Rutherford (unit)", }, ["cm/h"] = { name1 = "centimetre per hour", name1_us = "centimeter per hour", name2 = "centimetres per hour", name2_us = "centimeters per hour", symbol = "cm/h", utype = "speed", scale = 2.7777777777777775e-6, default = "in/h", link = "Metre per second", }, ["cm/s"] = { name1 = "centimetre per second", name1_us = "centimeter per second", name2 = "centimetres per second", name2_us = "centimeters per second", symbol = "cm/s", utype = "speed", scale = 0.01, default = "in/s", link = "Metre per second", }, ["cm/year"] = { name1 = "centimetre per year", name1_us = "centimeter per year", name2 = "centimetres per year", name2_us = "centimeters per year", symbol = "cm/year", utype = "speed", scale = 3.168873850681143e-10, default = "in/year", link = "Orders of magnitude (speed)", }, ["foot/s"] = { name1 = "foot per second", name2 = "foot per second", symbol = "ft/s", utype = "speed", scale = 0.3048, default = "m/s", }, ["ft/min"] = { name1 = "foot per minute", name2 = "feet per minute", symbol = "ft/min", utype = "speed", scale = 0.00508, default = "m/min", link = "Feet per second", }, ["ft/s"] = { name1 = "foot per second", name2 = "feet per second", symbol = "ft/s", utype = "speed", scale = 0.3048, default = "m/s", link = "Feet per second", }, ["furlong per fortnight"] = { name2 = "furlongs per fortnight", symbol = "furlong per fortnight", usename = 1, utype = "speed", scale = 0.00016630952380952381, default = "km/h mph", link = "FFF system", }, ["in/h"] = { name1 = "inch per hour", name2 = "inches per hour", symbol = "in/h", utype = "speed", scale = 7.0555555555555559e-6, default = "cm/h", link = "Inch", }, ["in/s"] = { name1 = "inch per second", name2 = "inches per second", symbol = "in/s", utype = "speed", scale = 0.0254, default = "cm/s", link = "Inch", }, ["in/year"] = { name1 = "inch per year", name2 = "inches per year", symbol = "in/year", utype = "speed", scale = 8.0489395807301024e-10, default = "cm/year", link = "Orders of magnitude (speed)", }, ["isp"] = { name1 = "second", symbol = "s", utype = "speed", scale = 9.80665, default = "km/s", link = "Specific impulse", }, ["km/d"] = { name1 = "kilometre per day", name1_us = "kilometer per day", name2 = "kilometres per day", name2_us = "kilometers per day", symbol = "km/d", utype = "speed", scale = 1.1574074074074074e-2, default = "mi/d", link = "Orders of magnitude (speed)", }, ["km/h"] = { name1 = "kilometre per hour", name1_us = "kilometer per hour", name2 = "kilometres per hour", name2_us = "kilometers per hour", symbol = "km/h", utype = "speed", scale = 0.27777777777777779, default = "mph", link = "Kilometres per hour", }, ["km/s"] = { name1 = "kilometre per second", name1_us = "kilometer per second", name2 = "kilometres per second", name2_us = "kilometers per second", symbol = "km/s", utype = "speed", scale = 1000, default = "mi/s", link = "Metre per second", }, ["kn"] = { name1 = "knot", symbol = "kn", utype = "speed", scale = 0.51444444444444448, default = "km/h mph", link = "Knot (unit)", }, ["kNs/kg"] = { name2 = "kN&#8209;s/kg", symbol = "kN&#8209;s/kg", utype = "speed", scale = 1000, default = "isp", link = "Specific impulse", }, ["m/min"] = { name1 = "metre per minute", name1_us = "meter per minute", name2 = "metres per minute", name2_us = "meters per minute", symbol = "m/min", utype = "speed", scale = 0.016666666666666666, default = "ft/min", link = "Metre per second", }, ["m/s"] = { name1 = "metre per second", name1_us = "meter per second", name2 = "metres per second", name2_us = "meters per second", symbol = "m/s", utype = "speed", scale = 1, default = "ft/s", }, ["Mach"] = { name2 = "Mach", symbol = "Mach", utype = "speed", builtin = "mach", scale = 0, iscomplex= true, default = "km/h mph", link = "Mach number", }, ["mi/d"] = { name1 = "mile per day", name2 = "miles per day", symbol = "mi/d", utype = "speed", scale = 1.8626666666666667e-2, default = "km/d", link = "Orders of magnitude (speed)", }, ["mi/s"] = { name1 = "mile per second", name2 = "miles per second", symbol = "mi/s", utype = "speed", scale = 1609.344, default = "km/s", link = "Mile", }, ["mm/h"] = { name1 = "millimetre per hour", name1_us = "millimeter per hour", name2 = "millimetres per hour", name2_us = "millimeters per hour", symbol = "mm/h", utype = "speed", scale = 2.7777777777777781e-7, default = "in/h", link = "Metre per second", }, ["mph"] = { name1 = "mile per hour", name2 = "miles per hour", symbol = "mph", utype = "speed", scale = 0.44704, default = "km/h", link = "Miles per hour", }, ["Ns/kg"] = { name2 = "N&#8209;s/kg", symbol = "N&#8209;s/kg", utype = "speed", scale = 1, default = "isp", link = "Specific impulse", }, ["si tsfc"] = { name2 = "g/(kN⋅s)", symbol = "g/(kN⋅s)", utype = "speed", scale = 9.9999628621379242e-7, invert = -1, iscomplex= true, default = "tsfc", link = "Thrust specific fuel consumption", }, ["tsfc"] = { name2 = "lb/(lbf⋅h)", symbol = "lb/(lbf⋅h)", utype = "speed", scale = 2.832545036049801e-5, invert = -1, iscomplex= true, default = "si tsfc", link = "Thrust specific fuel consumption", }, ["cm/y"] = { target = "cm/year", }, ["cm/yr"] = { target = "cm/year", }, ["in/y"] = { target = "in/year", }, ["in/yr"] = { target = "in/year", }, ["knot"] = { target = "kn", }, ["knots"] = { target = "kn", }, ["kph"] = { target = "km/h", }, ["mi/h"] = { target = "mph", }, ["mm/s"] = { per = { "mm", "s" }, utype = "speed", default = "in/s", link = "Metre per second", }, ["C"] = { name1 = "degree Celsius", name2 = "degrees Celsius", symbol = "°C", usesymbol= 1, utype = "temperature", scale = 1, offset = -273.15, iscomplex= true, istemperature= true, default = "F", link = "Celsius", }, ["F"] = { name1 = "degree Fahrenheit", name2 = "degrees Fahrenheit", symbol = "°F", usesymbol= 1, utype = "temperature", scale = 0.55555555555555558, offset = 32-273.15*(9/5), iscomplex= true, istemperature= true, default = "C", link = "Fahrenheit", }, ["K"] = { _name1 = "kelvin", _symbol = "K", usesymbol= 1, utype = "temperature", scale = 1, offset = 0, iscomplex= true, istemperature= true, prefixes = 1, default = "C F", link = "Kelvin", }, ["keVT"] = { name1 = "kiloelectronvolt", symbol = "keV", utype = "temperature", scale = 11.604505e6, offset = 0, iscomplex= true, default = "MK", link = "Electronvolt", }, ["R"] = { name1 = "degree Rankine", name2 = "degrees Rankine", symbol = "°R", usesymbol= 1, utype = "temperature", scale = 0.55555555555555558, offset = 0, iscomplex= true, istemperature= true, default = "K F C", link = "Rankine scale", }, ["Celsius"] = { target = "C", }, ["°C"] = { target = "C", }, ["°F"] = { target = "F", }, ["°R"] = { target = "R", }, ["C-change"] = { name1 = "degree Celsius change", name2 = "degrees Celsius change", symbol = "°C", usesymbol= 1, utype = "temperature change", scale = 1, default = "F-change", link = "Celsius", }, ["F-change"] = { name1 = "degree Fahrenheit change", name2 = "degrees Fahrenheit change", symbol = "°F", usesymbol= 1, utype = "temperature change", scale = 0.55555555555555558, default = "C-change", link = "Fahrenheit", }, ["K-change"] = { name1 = "kelvin change", name2 = "kelvins change", symbol = "K", usesymbol= 1, utype = "temperature change", scale = 1, default = "F-change", link = "Kelvin", }, ["°C-change"] = { target = "C-change", }, ["°F-change"] = { target = "F-change", }, ["century"] = { name1 = "century", name2 = "centuries", symbol = "ha", utype = "time", scale = 3155760000, default = "Gs", }, ["d"] = { name1 = "day", symbol = "d", utype = "time", scale = 86400, default = "ks", }, ["decade"] = { name1 = "decade", symbol = "daa", utype = "time", scale = 315576000, default = "Ms", }, ["dog year"] = { name1 = "dog year", symbol = "dog yr", utype = "time", scale = 220903200, default = "years", link = "List of unusual units of measurement#Dog year", }, ["fortnight"] = { symbol = "fortnight", usename = 1, utype = "time", scale = 1209600, default = "week", }, ["h"] = { name1 = "hour", symbol = "h", utype = "time", scale = 3600, default = "ks", }, ["long billion year"] = { name1 = "billion years", name2 = "billion years", symbol = "Ta", utype = "time", scale = 31557600000000000000, default = "Es", link = "Annum", }, ["millennium"] = { name1 = "millennium", name2 = "millennia", symbol = "ka", utype = "time", scale = 31557600000, default = "Gs", }, ["milliard year"] = { name1 = "milliard years", name2 = "milliard years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["million year"] = { name1 = "million years", name2 = "million years", symbol = "Ma", utype = "time", scale = 31557600000000, default = "Ts", link = "Annum", }, ["min"] = { name1 = "minute", symbol = "min", utype = "time", scale = 60, default = "s", }, ["month"] = { symbol = "month", usename = 1, utype = "time", scale = 2629800, default = "Ms", }, ["months"] = { name1 = "month", symbol = "mo", utype = "time", scale = 2629800, default = "year", }, ["s"] = { _name1 = "second", _symbol = "s", utype = "time", scale = 1, prefixes = 1, default = "v < 7200 ! min ! h", link = "Second", }, ["short billion year"] = { name1 = "billion years", name2 = "billion years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["short trillion year"] = { name1 = "trillion years", name2 = "trillion years", symbol = "Ta", utype = "time", scale = 31557600000000000000, default = "Es", link = "Annum", }, ["thousand million year"] = { name1 = "thousand million years", name2 = "thousand million years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["wk"] = { symbol = "week", usename = 1, utype = "time", scale = 604800, default = "Ms", }, ["year"] = { name1 = "year", symbol = "a", utype = "time", scale = 31557600, default = "Ms", link = "Annum", }, ["years"] = { name1 = "year", symbol = "yr", utype = "time", scale = 31557600, default = "Ms", link = "Annum", }, ["byr"] = { target = "short billion year", }, ["day"] = { target = "d", }, ["days"] = { target = "d", }, ["dog yr"] = { target = "dog year", }, ["Gyr"] = { target = "thousand million year", }, ["hour"] = { target = "h", }, ["hours"] = { target = "h", }, ["kMyr"] = { target = "thousand million year", }, ["kmyr"] = { target = "thousand million year", }, ["kyr"] = { target = "millennium", }, ["long byr"] = { target = "long billion year", }, ["minute"] = { target = "min", }, ["minutes"] = { target = "min", }, ["mth"] = { target = "month", }, ["Myr"] = { target = "million year", }, ["myr"] = { target = "million year", }, ["sec"] = { target = "s", }, ["second"] = { target = "s", }, ["seconds"] = { target = "s", }, ["tmyr"] = { target = "thousand million year", }, ["tryr"] = { target = "short trillion year", }, ["tyr"] = { target = "millennium", }, ["week"] = { target = "wk", }, ["weeks"] = { target = "wk", }, ["yr"] = { target = "year", }, ["kg.m"] = { name1 = "kilogram metre", name1_us = "kilogram meter", symbol = "kg⋅m", utype = "torque", scale = 9.80665, default = "Nm lbft", link = "Kilogram metre (torque)", }, ["kgf.m"] = { name1 = "kilogram force-metre", name1_us = "kilogram force-meter", symbol = "kgf⋅m", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["kgm"] = { name1 = "kilogram metre", name1_us = "kilogram meter", symbol = "kg⋅m", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["kpm"] = { name1 = "kilopond metre", name1_us = "kilopond meter", symbol = "kp⋅m", utype = "torque", scale = 9.80665, default = "Nm lbft", link = "Kilogram metre (torque)", }, ["lb-fft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "ft⋅lb<sub>f</sub>", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lb.ft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "lb⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lb.in"] = { name1 = "pound force-inch", symbol = "lb⋅in", utype = "torque", scale = 0.1129848290276167, default = "mN.m", link = "Pound-foot (torque)", }, ["lbfft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "lbf⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lbft"] = { name1 = "pound-foot", name2 = "pound-feet", symbol = "lb⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["m.kg-f"] = { name1 = "metre kilogram-force", name1_us = "meter kilogram-force", name2 = "metre kilograms-force", name2_us = "meter kilograms-force", symbol = "m⋅kg<sub>f</sub>", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["m.kgf"] = { name1 = "metre kilogram-force", name1_us = "meter kilogram-force", name2 = "metre kilograms-force", name2_us = "meter kilograms-force", symbol = "m⋅kgf", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["mN.m"] = { name1 = "millinewton-metre", name1_us = "millinewton-meter", symbol = "mN⋅m", utype = "torque", scale = 0.001, default = "lb.in", link = "Newton-metre", }, ["Nm"] = { _name1 = "newton-metre", _name1_us= "newton-meter", _symbol = "N⋅m", utype = "torque", alttype = "energy", scale = 1, prefixes = 1, default = "lbfft", link = "Newton-metre", }, ["kN/m"] = { per = { "kN", "-m-stiff" }, utype = "torque", default = "lbf/in", }, ["lbf/in"] = { per = { "lbf", "-in-stiff" }, utype = "torque", default = "kN/m", }, ["lb-f.ft"] = { target = "lb-fft", }, ["lbf.ft"] = { target = "lbfft", }, ["lbf·ft"] = { target = "lbfft", }, ["lb·ft"] = { target = "lb.ft", }, ["mkg-f"] = { target = "m.kg-f", }, ["mkgf"] = { target = "m.kgf", }, ["N.m"] = { target = "Nm", }, ["N·m"] = { target = "Nm", }, ["ton-mile"] = { symbol = "ton-mile", usename = 1, utype = "transportation", scale = 1.4599723182105602, default = "tkm", }, ["tkm"] = { name1 = "tonne-kilometre", name1_us = "tonne-kilometer", symbol = "tkm", utype = "transportation", scale = 1, default = "ton-mile", }, ["-12USoz(mL)serve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", utype = "volume", scale = 0.00035488235475000004, default = "mL", link = "Beverage can#Standard sizes", }, ["-12USoz(ml)serve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", utype = "volume", scale = 0.00035488235475000004, default = "ml", link = "Beverage can#Standard sizes", }, ["-12USozserve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz serving", utype = "volume", scale = 0.00035488235475000004, default = "mL", link = "Beverage can#Standard sizes", }, ["acre-foot"] = { name1 = "acre-foot", name2 = "acre-foot", symbol = "acre⋅ft", utype = "volume", scale = 1233.48183754752, default = "m3", }, ["acre-ft"] = { name1 = "acre-foot", name2 = "acre-feet", symbol = "acre⋅ft", utype = "volume", scale = 1233.48183754752, default = "m3", }, ["AUtbsp"] = { name1 = "Australian tablespoon", symbol = "AU&nbsp;tbsp", utype = "volume", scale = 0.000020, default = "ml", }, ["Bcuft"] = { name1 = "billion cubic foot", name2 = "billion cubic feet", symbol = "billion cu&nbsp;ft", utype = "volume", scale = 28316846.592, default = "Gl", link = "Cubic foot", }, ["bdft"] = { name1 = "board foot", name2 = "board feet", symbol = "bd&nbsp;ft", utype = "volume", scale = 0.0023597372167, default = "m3", }, ["board feet"] = { name2 = "board feet", symbol = "board foot", usename = 1, utype = "volume", scale = 0.0023597372167, default = "m3", }, ["board foot"] = { name2 = "board foot", symbol = "board foot", usename = 1, utype = "volume", scale = 0.0023597372167, default = "m3", }, ["cc"] = { name1 = "cubic centimetre", name1_us = "cubic centimeter", symbol = "cc", utype = "volume", scale = 0.000001, default = "cuin", }, ["CID"] = { name1 = "cubic inch", name2 = "cubic inches", symbol = "cu&nbsp;in", utype = "volume", scale = 0.000016387064, default = "cc", link = "Cubic inch#Engine displacement", }, ["cord"] = { symbol = "cord", utype = "volume", scale = 3.624556363776, default = "m3", link = "Cord (unit)", }, ["cufoot"] = { name1 = "cubic foot", name2 = "cubic foot", symbol = "cu&nbsp;ft", utype = "volume", scale = 0.028316846592, default = "m3", }, ["cuft"] = { name1 = "cubic foot", name2 = "cubic feet", symbol = "cu&nbsp;ft", utype = "volume", scale = 0.028316846592, default = "m3", }, ["cuin"] = { name1 = "cubic inch", name2 = "cubic inches", symbol = "cu&nbsp;in", utype = "volume", scale = 0.000016387064, default = "cm3", }, ["cumi"] = { name1 = "cubic mile", symbol = "cu&nbsp;mi", utype = "volume", scale = 4168181825.440579584, default = "km3", }, ["cuyd"] = { name1 = "cubic yard", symbol = "cu&nbsp;yd", utype = "volume", scale = 0.764554857984, default = "m3", }, ["firkin"] = { symbol = "firkin", usename = 1, utype = "volume", scale = 0.04091481, default = "L impgal USgal", link = "Firkin (unit)", }, ["foot3"] = { target = "cufoot", }, ["Goilbbl"] = { name1 = "billion barrels", name2 = "billion barrels", symbol = "Gbbl", utype = "volume", scale = 158987294.928, default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3", link = "Barrel (unit)#Oil barrel", }, ["gr water"] = { name1 = "grains water", name2 = "grains water", symbol = "gr H<sub>2</sub>O", utype = "volume", scale = 0.00000006479891, default = "cm3", link = "Grain (unit)", }, ["grt"] = { name1 = "gross register ton", symbol = "grt", utype = "volume", scale = 2.8316846592, default = "m3", link = "Gross register tonnage", }, ["impbbl"] = { name1 = "imperial barrel", symbol = "imp&nbsp;bbl", utype = "volume", scale = 0.16365924, default = "L impgal USgal", link = "Barrel (unit)", }, ["impbsh"] = { name1 = "imperial bushel", symbol = "imp&nbsp;bsh", utype = "volume", scale = 0.03636872, default = "L impgal USdrygal", }, ["impbu"] = { name1 = "imperial bushel", symbol = "imp&nbsp;bu", utype = "volume", scale = 0.03636872, default = "m3", }, ["impgal"] = { name1 = "imperial gallon", symbol = "imp&nbsp;gal", utype = "volume", scale = 0.00454609, default = "L USgal", }, ["impgi"] = { name1 = "gill", symbol = "gi", utype = "volume", scale = 0.0001420653125, default = "ml USoz", link = "Gill (unit)", }, ["impkenning"] = { name1 = "imperial kenning", symbol = "kenning", utype = "volume", scale = 0.01818436, default = "L USdrygal", link = "Kenning (unit)", }, ["impoz"] = { name1 = "imperial fluid ounce", symbol = "imp&nbsp;fl&nbsp;oz", utype = "volume", scale = 0.0000284130625, default = "ml USoz", }, ["imppk"] = { name1 = "imperial peck", symbol = "pk", utype = "volume", scale = 0.00909218, default = "L USdrygal", link = "Peck", }, ["imppt"] = { name1 = "imperial pint", symbol = "imp&nbsp;pt", utype = "volume", scale = 0.00056826125, default = "L", }, ["impqt"] = { name1 = "imperial quart", symbol = "imp&nbsp;qt", utype = "volume", scale = 0.0011365225, default = "ml USoz", customary= 3, }, ["kilderkin"] = { symbol = "kilderkin", usename = 1, utype = "volume", scale = 0.08182962, default = "L impgal USgal", }, ["koilbbl"] = { name1 = "thousand barrels", name2 = "thousand barrels", symbol = "kbbl", utype = "volume", scale = 158.987294928, default = "v * 1.58987294928 < 10 ! ! e3 ! m3", link = "Barrel (unit)#Oil barrel", }, ["L"] = { _name1 = "litre", _name1_us= "liter", _symbol = "L", utype = "volume", scale = 0.001, prefixes = 1, default = "impgal USgal", link = "Litre", }, ["l"] = { _name1 = "litre", _name1_us= "liter", _symbol = "l", utype = "volume", scale = 0.001, prefixes = 1, default = "impgal USgal", link = "Litre", }, ["ll"] = { name1 = "litre", name1_us = "liter", symbol = "l", utype = "volume", scale = 0.001, default = "impgal USgal", }, ["m3"] = { _name1 = "cubic metre", _name1_us= "cubic meter", _symbol = "m<sup>3</sup>", prefix_position= 7, utype = "volume", scale = 1, prefixes = 3, default = "cuft", link = "Cubic metre", }, ["Mbbl"] = { name1 = "thousand barrels", name2 = "thousand barrels", symbol = "Mbbl", utype = "volume", scale = 158.987294928, default = "v * 1.58987294928 < 10 ! e3 ! ! m3", link = "Barrel (unit)#Oil barrel", }, ["MMoilbbl"] = { name1 = "million barrels", name2 = "million barrels", symbol = "MMbbl", utype = "volume", scale = 158987.294928, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3", link = "Barrel (unit)#Oil barrel", }, ["Moilbbl"] = { name1 = "million barrels", name2 = "million barrels", symbol = "Mbbl", utype = "volume", scale = 158987.294928, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3", link = "Barrel (unit)#Oil barrel", }, ["MTON"] = { name1 = "measurement ton", symbol = "MTON", utype = "volume", scale = 1.13267386368, default = "m3", }, ["MUSgal"] = { name1 = "million US gallons", name1_us = "million U.S. gallons", name2 = "million US gallons", name2_us = "million U.S. gallons", symbol = "million US&nbsp;gal", sym_us = "million U.S.&nbsp;gal", utype = "volume", scale = 3785.411784, default = "Ml", link = "US gallon", }, ["oilbbl"] = { name1 = "barrel", symbol = "bbl", utype = "volume", scale = 0.158987294928, default = "m3", link = "Barrel (unit)#Oil barrel", }, ["stere"] = { symbol = "stere", usename = 1, utype = "volume", scale = 1, default = "cuft", }, ["Toilbbl"] = { name1 = "trillion barrels", name2 = "trillion barrels", symbol = "Tbbl", utype = "volume", scale = 158987294928, default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3", link = "Barrel (unit)#Oil barrel", }, ["USbbl"] = { name1 = "US barrel", name1_us = "U.S. barrel", symbol = "US&nbsp;bbl", sym_us = "U.S.&nbsp;bbl", utype = "volume", scale = 0.119240471196, default = "L USgal impgal", link = "Barrel (unit)", }, ["USbeerbbl"] = { name1 = "US beer barrel", name1_us = "U.S. beer barrel", symbol = "US&nbsp;bbl", sym_us = "U.S.&nbsp;bbl", utype = "volume", scale = 0.117347765304, default = "L USgal impgal", link = "Barrel (unit)", }, ["USbsh"] = { name1 = "US bushel", name1_us = "U.S. bushel", symbol = "US&nbsp;bsh", sym_us = "U.S.&nbsp;bsh", utype = "volume", scale = 0.03523907016688, default = "L USdrygal impgal", link = "Bushel", }, ["USbu"] = { name1 = "US bushel", name1_us = "U.S. bushel", symbol = "US&nbsp;bu", sym_us = "U.S.&nbsp;bu", utype = "volume", scale = 0.03523907016688, default = "L USdrygal impgal", link = "Bushel", }, ["USdrybbl"] = { name1 = "US dry barrel", name1_us = "U.S. dry barrel", symbol = "US&nbsp;dry&nbsp;bbl", sym_us = "U.S.&nbsp;dry&nbsp;bbl", utype = "volume", scale = 0.11562819898508, default = "m3", link = "Barrel (unit)", }, ["USdrygal"] = { name1 = "US dry gallon", name1_us = "U.S. dry gallon", symbol = "US&nbsp;dry&nbsp;gal", sym_us = "U.S.&nbsp;dry&nbsp;gal", utype = "volume", scale = 0.00440488377086, default = "L", link = "Gallon", }, ["USdrypt"] = { name1 = "US dry pint", name1_us = "U.S. dry pint", symbol = "US&nbsp;dry&nbsp;pt", sym_us = "U.S.&nbsp;dry&nbsp;pt", utype = "volume", scale = 0.0005506104713575, default = "ml", link = "Pint", }, ["USdryqt"] = { name1 = "US dry quart", name1_us = "U.S. dry quart", symbol = "US&nbsp;dry&nbsp;qt", sym_us = "U.S.&nbsp;dry&nbsp;qt", utype = "volume", scale = 0.001101220942715, default = "ml", link = "Quart", }, ["USflgal"] = { name1 = "US gallon", name1_us = "U.S. gallon", symbol = "US fl gal", sym_us = "U.S.&nbsp;fl&nbsp;gal", utype = "volume", scale = 0.003785411784, default = "L impgal", link = "Gallon", }, ["USgal"] = { name1 = "US gallon", name1_us = "U.S. gallon", symbol = "US&nbsp;gal", sym_us = "U.S.&nbsp;gal", utype = "volume", scale = 0.003785411784, default = "L impgal", }, ["USgi"] = { name1 = "gill", symbol = "gi", utype = "volume", scale = 0.0001182941183, default = "ml impoz", link = "Gill (unit)", }, ["USkenning"] = { name1 = "US kenning", name1_us = "U.S. kenning", symbol = "US&nbsp;kenning", sym_us = "U.S.&nbsp;kenning", utype = "volume", scale = 0.01761953508344, default = "L impgal", link = "Kenning (unit)", }, ["USmin"] = { name1 = "US minim", name1_us = "U.S. minim", symbol = "US&nbsp;min", sym_us = "U.S.&nbsp;min", utype = "volume", scale = 0.000000061611519921875, default = "ml", link = "Minim (unit)", }, ["USoz"] = { name1 = "US fluid ounce", name1_us = "U.S. fluid ounce", symbol = "US&nbsp;fl&nbsp;oz", sym_us = "U.S.&nbsp;fl&nbsp;oz", utype = "volume", scale = 0.0000295735295625, default = "ml", }, ["USpk"] = { name1 = "US peck", name1_us = "U.S. peck", symbol = "US&nbsp;pk", sym_us = "U.S.&nbsp;pk", utype = "volume", scale = 0.00880976754172, default = "L impgal", link = "Peck", }, ["USpt"] = { name1 = "US pint", name1_us = "U.S. pint", symbol = "US&nbsp;pt", sym_us = "U.S.&nbsp;pt", utype = "volume", scale = 0.000473176473, default = "L imppt", link = "Pint", }, ["USqt"] = { name1 = "US quart", name1_us = "U.S. quart", symbol = "US&nbsp;qt", sym_us = "U.S.&nbsp;qt", utype = "volume", scale = 0.000946352946, default = "ml", link = "Quart", customary= 1, }, ["USquart"] = { name1 = "US quart", name1_us = "U.S. quart", symbol = "US&nbsp;qt", sym_us = "U.S.&nbsp;qt", utype = "volume", scale = 0.000946352946, default = "ml impoz", link = "Quart", }, ["UStbsp"] = { name1 = "US tablespoon", name1_us = "U.S. tablespoon", symbol = "US&nbsp;tbsp", sym_us = "U.S.&nbsp;tbsp", utype = "volume", scale = 1.4786764781250001e-5, default = "ml", }, ["winecase"] = { symbol = "case", usename = 1, utype = "volume", scale = 0.009, default = "L", link = "Case (goods)", }, ["*U.S.drygal"] = { target = "USdrygal", sp_us = true, customary= 2, }, ["*U.S.gal"] = { target = "USgal", sp_us = true, customary= 2, }, ["+USdrygal"] = { target = "USdrygal", customary= 1, }, ["+usfloz"] = { target = "USoz", link = "Fluid ounce", customary= 1, }, ["+USgal"] = { target = "USgal", customary= 1, }, ["+USoz"] = { target = "USoz", customary= 1, }, ["@impgal"] = { target = "impgal", link = "Gallon", customary= 3, }, ["acre feet"] = { target = "acre-ft", }, ["acre foot"] = { target = "acre-foot", }, ["acre ft"] = { target = "acre-ft", }, ["acre-feet"] = { target = "acre-ft", }, ["acre.foot"] = { target = "acre-foot", }, ["acre.ft"] = { target = "acre-ft", }, ["acre·ft"] = { target = "acre-ft", }, ["bushels"] = { target = "USbsh", }, ["cid"] = { target = "CID", }, ["ft3"] = { target = "cuft", }, ["gal"] = { target = "USgal", }, ["gallon"] = { shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallon%})", }, ["gallons"] = { shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallons%})", }, ["Gcuft"] = { target = "e9cuft", }, ["impfloz"] = { target = "impoz", }, ["Impgal"] = { target = "impgal", }, ["in3"] = { target = "cuin", symbol = "in<sup>3</sup>", }, ["hm³"] = { target = "hm3", }, ["kcuft"] = { target = "e3cuft", }, ["kcum"] = { target = "e3m3", }, ["km³"] = { target = "km3", }, ["liter"] = { target = "L", sp_us = true, }, ["liters"] = { target = "L", sp_us = true, }, ["litre"] = { target = "L", }, ["litres"] = { target = "L", }, ["Mcuft"] = { target = "e6cuft", }, ["Mcum"] = { target = "e6m3", }, ["Mft3"] = { target = "e6cuft", }, ["mi3"] = { target = "cumi", }, ["m³"] = { target = "m3", }, ["Pcuft"] = { target = "e15cuft", }, ["pt"] = { shouldbe = "Use %{USpt%} for US pints or %{imppt%} for imperial pints (not %{pt%})", }, ["qt"] = { shouldbe = "Use %{USqt%} for US quarts or %{impqt%} for imperial quarts (not %{qt%})", }, ["Tcuft"] = { target = "e12cuft", }, ["Tft3"] = { target = "e12cuft", }, ["U.S.bbl"] = { target = "USbbl", sp_us = true, default = "L U.S.gal impgal", }, ["U.S.beerbbl"] = { target = "USbeerbbl", sp_us = true, default = "L U.S.gal impgal", }, ["U.S.bsh"] = { target = "USbsh", sp_us = true, default = "L U.S.drygal impgal", }, ["U.S.bu"] = { target = "USbu", sp_us = true, default = "L U.S.drygal impgal", }, ["U.S.drybbl"] = { target = "USdrybbl", sp_us = true, }, ["U.S.drygal"] = { target = "USdrygal", sp_us = true, }, ["U.S.drypt"] = { target = "USdrypt", sp_us = true, }, ["U.S.dryqt"] = { target = "USdryqt", sp_us = true, }, ["U.S.flgal"] = { target = "USflgal", sp_us = true, }, ["U.S.floz"] = { target = "USoz", sp_us = true, }, ["U.S.gal"] = { target = "USgal", sp_us = true, link = "U.S. gallon", }, ["u.s.gal"] = { target = "USgal", sp_us = true, link = "U.S. gallon", }, ["U.S.gi"] = { target = "USgi", sp_us = true, }, ["U.S.kenning"] = { target = "USkenning", sp_us = true, }, ["U.S.oz"] = { target = "USoz", sp_us = true, }, ["U.S.pk"] = { target = "USpk", sp_us = true, }, ["U.S.pt"] = { target = "USpt", sp_us = true, }, ["U.S.qt"] = { target = "USqt", sp_us = true, default = "L impqt", customary= 2, }, ["usbbl"] = { target = "USbbl", }, ["usbeerbbl"] = { target = "USbeerbbl", }, ["usbsh"] = { target = "USbsh", }, ["usbu"] = { target = "USbu", }, ["usdrybbl"] = { target = "USdrybbl", }, ["usdrygal"] = { target = "USdrygal", }, ["usdrypt"] = { target = "USdrypt", }, ["usdryqt"] = { target = "USdryqt", }, ["USfloz"] = { target = "USoz", }, ["usfloz"] = { target = "USoz", }, ["USGAL"] = { target = "USgal", }, ["usgal"] = { target = "USgal", }, ["usgi"] = { target = "USgi", }, ["uskenning"] = { target = "USkenning", }, ["usoz"] = { target = "USoz", }, ["uspk"] = { target = "USpk", }, ["uspt"] = { target = "USpt", }, ["usqt"] = { target = "USqt", }, ["yd3"] = { target = "cuyd", }, ["cuft/sqmi"] = { per = { "cuft", "sqmi" }, utype = "volume per unit area", default = "m3/km2", }, ["m3/ha"] = { name1 = "cubic metre per hectare", name1_us = "cubic meter per hectare", name2 = "cubic metres per hectare", name2_us = "cubic meters per hectare", symbol = "m<sup>3</sup>/ha", utype = "volume per unit area", scale = 0.0001, default = "USbu/acre", link = "Hectare", }, ["m3/km2"] = { per = { "m3", "km2" }, utype = "volume per unit area", default = "cuft/sqmi", }, ["U.S.gal/acre"] = { per = { "U.S.gal", "acre" }, utype = "volume per unit area", default = "m3/km2", }, ["USbu/acre"] = { name2 = "US bushels per acre", symbol = "US bushel per acre", usename = 1, utype = "volume per unit area", scale = 8.7077638761350888e-6, default = "m3/ha", link = "Bushel", }, ["USgal/acre"] = { per = { "USgal", "acre" }, utype = "volume per unit area", default = "m3/km2", }, ["cuyd/mi"] = { per = { "cuyd", "mi" }, utype = "volume per unit length", default = "m3/km", }, ["m3/km"] = { per = { "m3", "km" }, utype = "volume per unit length", default = "cuyd/mi", }, ["mich"] = { combination= { "ch", "mi" }, multiple = { 80 }, utype = "length", }, ["michlk"] = { combination= { "chlk", "mi" }, multiple = { 80 }, utype = "length", }, ["michainlk"] = { combination= { "chainlk", "mi" }, multiple = { 80 }, utype = "length", }, ["miyd"] = { combination= { "yd", "mi" }, multiple = { 1760 }, utype = "length", }, ["miydftin"] = { combination= { "in", "ft", "yd", "mi" }, multiple = { 12, 3, 1760 }, utype = "length", }, ["mift"] = { combination= { "ft", "mi" }, multiple = { 5280 }, utype = "length", }, ["ydftin"] = { combination= { "in", "ft", "yd" }, multiple = { 12, 3 }, utype = "length", }, ["ydft"] = { combination= { "ft", "yd" }, multiple = { 3 }, utype = "length", }, ["ftin"] = { combination= { "in", "ft" }, multiple = { 12 }, utype = "length", }, ["footin"] = { combination= { "in", "foot" }, multiple = { 12 }, utype = "length", }, ["handin"] = { combination= { "in", "hand" }, multiple = { 4 }, utype = "length", }, ["lboz"] = { combination= { "oz", "lb" }, multiple = { 16 }, utype = "mass", }, ["stlb"] = { combination= { "lb", "st" }, multiple = { 14 }, utype = "mass", }, ["stlboz"] = { combination= { "oz", "lb", "st" }, multiple = { 16, 14 }, utype = "mass", }, ["st and lb"] = { combination= { "lb", "st" }, multiple = { 14 }, utype = "mass", }, ["GN LTf"] = { combination= { "GN", "-LTf" }, utype = "force", }, ["GN LTf STf"] = { combination= { "GN", "-LTf", "-STf" }, utype = "force", }, ["GN STf"] = { combination= { "GN", "-STf" }, utype = "force", }, ["GN STf LTf"] = { combination= { "GN", "-STf", "-LTf" }, utype = "force", }, ["kN LTf"] = { combination= { "kN", "-LTf" }, utype = "force", }, ["kN LTf STf"] = { combination= { "kN", "-LTf", "-STf" }, utype = "force", }, ["kN STf"] = { combination= { "kN", "-STf" }, utype = "force", }, ["kN STf LTf"] = { combination= { "kN", "-STf", "-LTf" }, utype = "force", }, ["LTf STf"] = { combination= { "-LTf", "-STf" }, utype = "force", }, ["MN LTf"] = { combination= { "MN", "-LTf" }, utype = "force", }, ["MN LTf STf"] = { combination= { "MN", "-LTf", "-STf" }, utype = "force", }, ["MN STf"] = { combination= { "MN", "-STf" }, utype = "force", }, ["MN STf LTf"] = { combination= { "MN", "-STf", "-LTf" }, utype = "force", }, ["STf LTf"] = { combination= { "-STf", "-LTf" }, utype = "force", }, ["L/100 km mpgimp"] = { combination= { "L/100 km", "mpgimp" }, utype = "fuel efficiency", }, ["l/100 km mpgimp"] = { combination= { "l/100 km", "mpgimp" }, utype = "fuel efficiency", }, ["L/100 km mpgUS"] = { combination= { "L/100 km", "mpgus" }, utype = "fuel efficiency", }, ["L/100 km mpgus"] = { combination= { "L/100 km", "mpgus" }, utype = "fuel efficiency", }, ["l/100 km mpgus"] = { combination= { "l/100 km", "mpgus" }, utype = "fuel efficiency", }, ["mpgimp L/100 km"] = { combination= { "mpgimp", "L/100 km" }, utype = "fuel efficiency", }, ["LT ST t"] = { combination= { "lt", "-ST", "t" }, utype = "mass", }, ["LT t ST"] = { combination= { "lt", "t", "-ST" }, utype = "mass", }, ["ST LT t"] = { combination= { "-ST", "lt", "t" }, utype = "mass", }, ["ST t LT"] = { combination= { "-ST", "t", "lt" }, utype = "mass", }, ["t LT ST"] = { combination= { "t", "lt", "-ST" }, utype = "mass", }, ["ton"] = { combination= { "LT", "ST" }, utype = "mass", }, ["kPa kg/cm2"] = { combination= { "kPa", "kgf/cm2" }, utype = "pressure", }, ["kPa lb/in2"] = { combination= { "kPa", "-lb/in2" }, utype = "pressure", }, ["floz"] = { combination= { "impoz", "USoz" }, utype = "volume", }, } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local default_exceptions = { -- Prefixed units with a default different from that of the base unit. -- Each key item is a prefixed symbol (unitcode for engineering notation). ["cm<sup>2</sup>"] = "sqin", ["dm<sup>2</sup>"] = "sqin", ["e3acre"] = "km2", ["e3m2"] = "e6sqft", ["e6acre"] = "km2", ["e6ha"] = "e6acre", ["e6km2"] = "e6sqmi", ["e6m2"] = "e6sqft", ["e6sqft"] = "v * 9.290304 < 100 ! e3 ! e6 ! m2", ["e6sqmi"] = "e6km2", ["hm<sup>2</sup>"] = "acre", ["km<sup>2</sup>"] = "sqmi", ["mm<sup>2</sup>"] = "sqin", ["aJ"] = "eV", ["e3BTU"] = "MJ", ["e6BTU"] = "GJ", ["EJ"] = "kWh", ["fJ"] = "keV", ["GJ"] = "kWh", ["MJ"] = "kWh", ["PJ"] = "kWh", ["pJ"] = "MeV", ["TJ"] = "kWh", ["YJ"] = "kWh", ["yJ"] = "μeV", ["ZJ"] = "kWh", ["zJ"] = "meV", ["e12cuft/a"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/a", ["e12cuft/d"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/d", ["e12m3/a"] = "Tcuft/a", ["e12m3/d"] = "Tcuft/d", ["e3cuft/a"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/a", ["e3cuft/d"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/d", ["e3cuft/s"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/s", ["e3m3/a"] = "v < 28.316846592 ! k ! M ! cuft/a", ["e3m3/d"] = "v < 28.316846592 ! k ! M ! cuft/d", ["e3m3/s"] = "v < 28.316846592 ! k ! M ! cuft/s", ["e3USgal/a"] = "v * 3.785411784 < 1000 ! ! e3 ! m3/a", ["e6cuft/a"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/a", ["e6cuft/d"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/d", ["e6cuft/s"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/s", ["e6m3/a"] = "v < 28.316846592 ! M ! G ! cuft/a", ["e6m3/d"] = "v < 28.316846592 ! M ! G ! cuft/d", ["e6m3/s"] = "v < 28.316846592 ! e6 ! e9 ! cuft/s", ["e6USgal/a"] = "v * 3.785411784 < 1000 ! e3 ! e6 ! m3/a", ["e9cuft/a"] = "m3/a", ["e9cuft/d"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3/d", ["e9m3/a"] = "v < 28.316846592 ! G ! T ! cuft/a", ["e9m3/d"] = "v < 28.316846592 ! G ! T ! cuft/d", ["e9m3/s"] = "v < 28.316846592 ! e9 ! e12 ! cuft/s", ["e9USgal/a"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/a", ["e9USgal/s"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/s", ["nN"] = "gr-f", ["μN"] = "gr-f", ["mN"] = "oz-f", ["am"] = "in", ["cm"] = "in", ["dam"] = "ft", ["dm"] = "in", ["e12km"] = "e12mi", ["e12mi"] = "e12km", ["e3AU"] = "ly", ["e3km"] = "e3mi", ["e3mi"] = "e3km", ["e6km"] = "e6mi", ["e6mi"] = "e6km", ["e9km"] = "AU", ["e9mi"] = "e9km", ["Em"] = "mi", ["fm"] = "in", ["Gm"] = "mi", ["hm"] = "ft", ["km"] = "mi", ["mm"] = "in", ["Mm"] = "mi", ["nm"] = "in", ["Pm"] = "mi", ["pm"] = "in", ["Tm"] = "mi", ["Ym"] = "mi", ["ym"] = "in", ["Zm"] = "mi", ["zm"] = "in", ["μm"] = "in", ["e12lb"] = "v * 4.5359237 < 10 ! Mt ! Gt", ["e3lb"] = "v * 4.5359237 < 10 ! kg ! t", ["e3ozt"] = "v * 0.311034768 < 10 ! kg ! t", ["e3t"] = "LT ST", ["e6carat"] = "t", ["e6lb"] = "v * 4.5359237 < 10 ! t ! kilotonne", ["e6ozt"] = "lb kg", ["e6ST"] = "Mt", ["e6t"] = "LT ST", ["e9lb"] = "v * 4.5359237 < 10 ! kilotonne ! Mt", ["e9t"] = "LT ST", ["Gg"] = "lb", ["kg"] = "lb", ["mg"] = "gr", ["Mg"] = "LT ST", ["ng"] = "gr", ["μg"] = "gr", ["mBq"] = "fCi", ["kBq"] = "nCi", ["MBq"] = "μCi", ["GBq"] = "mCi", ["TBq"] = "Ci", ["PBq"] = "kCi", ["EBq"] = "kCi", ["fCi"] = "mBq", ["pCi"] = "Bq", ["nCi"] = "Bq", ["μCi"] = "kBq", ["mCi"] = "MBq", ["kCi"] = "TBq", ["MCi"] = "PBq", ["ns"] = "μs", ["μs"] = "ms", ["ms"] = "s", ["ks"] = "h", ["Ms"] = "week", ["Gs"] = "decade", ["Ts"] = "millennium", ["Ps"] = "million year", ["Es"] = "thousand million year", ["MK"] = "keVT", ["cL"] = "impoz usoz", ["cl"] = "impoz usoz", ["cm<sup>3</sup>"] = "cuin", ["dL"] = "impoz usoz", ["dl"] = "impoz usoz", ["mm<sup>3</sup>"] = "cuin", ["dm<sup>3</sup>"] = "cuin", ["e12cuft"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3", ["e12impgal"] = "v * 4.54609 < 1000 ! T ! P ! l", ["e12m3"] = "v < 28.316846592 ! T ! P ! cuft", ["e12U.S.gal"] = "v * 3.785411784 < 1000 ! T ! P ! l", ["e12USgal"] = "v * 3.785411784 < 1000 ! T ! P ! l", ["e15cuft"] = "v * 2.8316846592 < 100 ! e12 ! e15 ! m3", ["e15m3"] = "Pcuft", ["e3bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3", ["e3cuft"] = "v * 2.8316846592 < 100 ! ! e3 ! m3", ["e3impgal"] = "v * 4.54609 < 1000 ! k ! M ! l", ["e3m3"] = "v < 28.316846592 ! k ! M ! cuft", ["e3U.S.gal"] = "v * 3.785411784 < 1000 ! k ! M ! l", ["e3USgal"] = "v * 3.785411784 < 1000 ! k ! M ! l", ["e6bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3", ["e6cuft"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3", ["e6cuyd"] = "v * 7.64554857984 < 10 ! e3 ! e6 ! m3", ["e6impgal"] = "v * 4.54609 < 1000 ! M ! G ! l", ["e6L"] = "USgal", ["e6m3"] = "v < 28.316846592 ! M ! G ! cuft", ["e6U.S.gal"] = "v * 3.785411784 < 1000 ! M ! G ! l", ["e6USgal"] = "v * 3.785411784 < 1000 ! M ! G ! l", ["e9bdft"] = "v * 0.23597372167 < 100 ! e6 ! e9 ! m3", ["e9cuft"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3", ["e9impgal"] = "v * 4.54609 < 1000 ! G ! T ! l", ["e9m3"] = "v < 28.316846592 ! G ! T ! cuft", ["e9U.S.gal"] = "v * 3.785411784 < 1000 ! G ! T ! l", ["e9USgal"] = "v * 3.785411784 < 1000 ! G ! T ! l", ["GL"] = "cuft", ["Gl"] = "cuft", ["kL"] = "cuft", ["kl"] = "cuft", ["km<sup>3</sup>"] = "cumi", ["mL"] = "impoz usoz", ["ml"] = "impoz usoz", ["Ml"] = "v < 28.316846592 ! e3 ! e6 ! cuft", ["ML"] = "v < 28.316846592 ! e3 ! e6 ! cuft", ["TL"] = "cumi", ["Tl"] = "cumi", ["μL"] = "cuin", ["μl"] = "cuin", } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local link_exceptions = { -- Prefixed units with a linked article different from that of the base unit. -- Each key item is a prefixed symbol (not unitcode). ["mm<sup>2</sup>"] = "Square millimetre", ["cm<sup>2</sup>"] = "Square centimetre", ["dm<sup>2</sup>"] = "Square decimetre", ["km<sup>2</sup>"] = "Square kilometre", ["kJ"] = "Kilojoule", ["MJ"] = "Megajoule", ["GJ"] = "Gigajoule", ["TJ"] = "Terajoule", ["fm"] = "Femtometre", ["pm"] = "Picometre", ["nm"] = "Nanometre", ["μm"] = "Micrometre", ["mm"] = "Millimetre", ["cm"] = "Centimetre", ["dm"] = "Decimetre", ["dam"] = "Decametre", ["hm"] = "Hectometre", ["km"] = "Kilometre", ["Mm"] = "Megametre", ["Gm"] = "Gigametre", ["Tm"] = "Terametre", ["Pm"] = "Petametre", ["Em"] = "Exametre", ["Zm"] = "Zettametre", ["Ym"] = "Yottametre", ["μg"] = "Microgram", ["mg"] = "Milligram", ["kg"] = "Kilogram", ["Mg"] = "Tonne", ["yW"] = "Yoctowatt", ["zW"] = "Zeptowatt", ["aW"] = "Attowatt", ["fW"] = "Femtowatt", ["pW"] = "Picowatt", ["nW"] = "Nanowatt", ["μW"] = "Microwatt", ["mW"] = "Milliwatt", ["kW"] = "Kilowatt", ["MW"] = "Megawatt", ["GW"] = "Gigawatt", ["TW"] = "Terawatt", ["PW"] = "Petawatt", ["EW"] = "Exawatt", ["ZW"] = "Zettawatt", ["YW"] = "Yottawatt", ["as"] = "Attosecond", ["fs"] = "Femtosecond", ["ps"] = "Picosecond", ["ns"] = "Nanosecond", ["μs"] = "Microsecond", ["ms"] = "Millisecond", ["ks"] = "Kilosecond", ["Ms"] = "Megasecond", ["Gs"] = "Gigasecond", ["Ts"] = "Terasecond", ["Ps"] = "Petasecond", ["Es"] = "Exasecond", ["Zs"] = "Zettasecond", ["Ys"] = "Yottasecond", ["mm<sup>3</sup>"] = "Cubic millimetre", ["cm<sup>3</sup>"] = "Cubic centimetre", ["dm<sup>3</sup>"] = "Cubic decimetre", ["dam<sup>3</sup>"] = "Cubic decametre", ["km<sup>3</sup>"] = "Cubic kilometre", ["μL"] = "Microlitre", ["μl"] = "Microlitre", ["mL"] = "Millilitre", ["ml"] = "Millilitre", ["cL"] = "Centilitre", ["cl"] = "Centilitre", ["dL"] = "Decilitre", ["dl"] = "Decilitre", ["daL"] = "Decalitre", ["dal"] = "Decalitre", ["hL"] = "Hectolitre", ["hl"] = "Hectolitre", ["kL"] = "Kilolitre", ["kl"] = "Kilolitre", ["ML"] = "Megalitre", ["Ml"] = "Megalitre", ["GL"] = "Gigalitre", ["Gl"] = "Gigalitre", ["TL"] = "Teralitre", ["Tl"] = "Teralitre", ["PL"] = "Petalitre", ["Pl"] = "Petalitre", } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local per_unit_fixups = { -- Automatically created per units of form "x/y" may have their unit type -- changed, for example, "length/time" is changed to "speed". -- Other adjustments can also be specified. ["/area"] = "per unit area", ["/volume"] = "per unit volume", ["area/area"] = "area per unit area", ["energy/length"] = "energy per unit length", ["energy/mass"] = "energy per unit mass", ["energy/time"] = { utype = "power", link = "Power (physics)" }, ["energy/volume"] = "energy per unit volume", ["force/area"] = { utype = "pressure", link = "Pressure" }, ["length/length"] = { utype = "gradient", link = "Grade (slope)" }, ["length/time"] = { utype = "speed", link = "Speed" }, ["length/time/time"] = { utype = "acceleration", link = "Acceleration" }, ["mass/area"] = { utype = "pressure", multiplier = 9.80665 }, ["mass/length"] = "linear density", ["mass/mass"] = "concentration", ["mass/power"] = "mass per unit power", ["mass/time"] = "mass per unit time", ["mass/volume"] = { utype = "density", link = "Density" }, ["power/mass"] = "power per unit mass", ["power/volume"] = { link = "Power density" }, ["pressure/length"] = "fracture gradient", ["speed/time"] = { utype = "acceleration", link = "Acceleration" }, ["volume/area"] = "volume per unit area", ["volume/length"] = "volume per unit length", ["volume/time"] = "flow", } return { all_units = all_units, default_exceptions = default_exceptions, link_exceptions = link_exceptions, per_unit_fixups = per_unit_fixups, } 69cd04fba2962c152d0008b00cb8b7df57549e07 Module:Convert/text 828 722 1107 2024-10-26T23:10:17Z wikipedia>Johnuniq 0 update from sandbox per [[Template talk:Convert#Module version 30]] Scribunto text/plain -- Text used by Module:Convert for enwiki. -- This is a separate module to simplify translation for use on another wiki. -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. -- Some units accept an SI prefix before the unit code, such as "kg" for kilogram. local SIprefixes = { -- The prefix field is what the prefix should be, if different from the prefix used. ['Q'] = { exponent = 30, name = 'quetta', }, ['R'] = { exponent = 27, name = 'ronna', }, ['Y'] = { exponent = 24, name = 'yotta', }, ['Z'] = { exponent = 21, name = 'zetta', }, ['E'] = { exponent = 18, name = 'exa' , }, ['P'] = { exponent = 15, name = 'peta' , }, ['T'] = { exponent = 12, name = 'tera' , }, ['G'] = { exponent = 9, name = 'giga' , }, ['M'] = { exponent = 6, name = 'mega' , }, ['k'] = { exponent = 3, name = 'kilo' , }, ['h'] = { exponent = 2, name = 'hecto', }, ['da']= { exponent = 1, name = 'deca' , name_us = 'deka' }, ['d'] = { exponent = -1, name = 'deci' , }, ['c'] = { exponent = -2, name = 'centi', }, ['m'] = { exponent = -3, name = 'milli', }, ['μ'] = { exponent = -6, name = 'micro', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC ['µ'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5 ['u'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- not an SI prefix, but allow for people typing this ['n'] = { exponent = -9, name = 'nano' , }, ['p'] = { exponent =-12, name = 'pico' , }, ['f'] = { exponent =-15, name = 'femto', }, ['a'] = { exponent =-18, name = 'atto' , }, ['z'] = { exponent =-21, name = 'zepto', }, ['y'] = { exponent =-24, name = 'yocto', }, ['r'] = { exponent =-27, name = 'ronto', }, ['q'] = { exponent =-30, name = 'quecto', }, } -- Some units can be qualified with one of the following prefixes, when linked. local customary_units = { { "US", link = "United States customary units" }, { "U.S.", link = "United States customary units" }, { "imperial", link = "Imperial units" }, { "imp", link = "Imperial units" }, } -- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km"). -- key = { "name", link = "article title", exponent = numeric_key_value } -- If lk=on and link is defined, the name of the number will appear as a link. local eng_scales = { ["3"] = { "thousand", exponent = 3 }, ["6"] = { "million", exponent = 6 }, ["9"] = { "billion", link = "1000000000 (number)", exponent = 9 }, ["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 }, ["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 }, } local all_categories = { unit = "[[Category:Convert errors]]", option = "[[Category:Convert errors]]", warning = '[[Category:Convert invalid options]]', tracking = '[[Category:Convert tracking]]', } -- For some error messages, the following puts the wanted style around -- each unit code marked like '...%{ft%}...'. local unitcode_regex = '%%([{}])' local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28 -- All messages that may be displayed if a problem occurs. local all_messages = { -- Message format string: $1=title, $2=text, $3=category, $4=anchor. -- Each displayed message starts with "Convert:" so can easily locate by searching article. cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>', cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>', cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3', -- Each of following messages is a table: -- { [1] = 'title', -- mouseover title text -- [2] = 'text', -- link text displayed in article -- [3] = 'category key', -- key to lookup category in all_categories -- [4] = 'anchor', -- anchor for link to relevant section on help page -- regex = gsub_regex, -- replace = gsub_table, -- } Mouseover title text Link text CatKey Anchor cvt_bad_input = { 'input "$1" must be a number and unit' , 'invalid input' , 'option', 'invalid_input' }, cvt_bad_num = { 'Value "$1" must be a number' , 'invalid number' , 'option', 'invalid_number' }, cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' }, cvt_invalid_num = { 'Number has overflowed' , 'number overflow' , 'option', 'number_overflow' }, cvt_no_num = { 'Needs the number to be converted' , 'needs a number' , 'option', 'needs_number' }, cvt_no_num2 = { 'Needs another number for a range' , 'needs another number', 'option', 'needs_another_number' }, cvt_bad_altitude = { '"$1" needs an integer' , 'invalid altitude' , 'option', 'invalid_altitude' }, cvt_bad_frac = { '"$1" needs an integer above 1' , 'invalid fraction' , 'option', 'invalid_fraction' }, cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' }, cvt_bad_sigfig = { '"$1" needs a positive integer' , 'invalid sigfig' , 'option', 'invalid_sigfig' }, cvt_empty_option = { 'Ignored empty option "$1"' , 'empty option' , 'option', 'empty_option' }, cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true }, cvt_no_spell = { 'Spelling is not available' , 'bug, ask for help' , 'option', 'ask_for_help' }, cvt_unknown_option = { 'Ignored invalid option "$1"' , 'invalid option' , 'option', 'invalid_option' }, cvt_wd_fail = { 'Unable to access Wikidata' , 'wikidata problem' , 'option', 'wikidata_problem' }, cvt_bad_default = { 'Unit "$1" has an invalid default' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' }, cvt_no_default = { 'Unit "$1" has no default output unit' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_no_unit = { 'Needs name of unit' , 'needs unit name' , 'unit' , 'needs_unit_name' }, cvt_unknown = { 'Unit name "$1" is not known' , 'unknown unit' , 'unit' , 'unknown_unit' }, cvt_should_be = { '$1' , 'ambiguous unit' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace }, cvt_mismatch = { 'Cannot convert "$1" to "$2"' , 'unit mismatch' , 'unit' , 'unit_mismatch' }, cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_lookup = { 'Unit "$1" is incorrectly defined' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, } -- Text to join input value/unit with output value/unit. local disp_joins = { -- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; " -- [wantname] gives default abbr=off ["or"] = { " or " , "" , " or ", wantname = true }, ["sqbr-sp"] = { " [" , "]" }, ["sqbr-nbsp"] = { "&nbsp;[" , "]" }, ["comma"] = { ", " , "" , ", " }, ["semicolon"] = { "; " , "" }, ["slash-sp"] = { " / " , "" , wantname = true }, ["slash-nbsp"] = { "&nbsp;/ ", "" , wantname = true }, ["slash-nosp"] = { "/" , "" , wantname = true }, ["b"] = { " (" , ")" }, ["(or)"] = { " (" , ")", " or " }, ["br"] = { "<br />" , "" , wantname = true }, ["br()"] = { "<br />(" , ")", wantname = true }, } -- Text to separate values in a range. local range_types = { -- Specifying a table requires either: -- * "off" and "on" values (for "abbr=off" and "abbr=on"), or -- * "input" and "output" values (for LHS and RHS); -- other fields are optional. -- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens. -- With "exception = true", that also occurs with "adj=on|abbr=on". -- If "adj" is defined here, that text (unchanged) is used with "adj=on". ["+"] = " + ", [","] = ",&nbsp;", [", and"] = ", and ", [", or"] = ", or ", ["by"] = " by ", ["-"] = "–", ["to about"] = " to about ", ["and"] = { off = " and ", on = " and ", exception = true }, ["and(-)"] = { input = " and ", output = "–" }, ["or"] = { off = " or " , on = " or " , exception = true }, ["to"] = { off = " to " , on = " to " , exception = true }, ["to(-)"] = { input = "&nbsp;to ", output = "–" }, ["+/-"] = { off = "&nbsp;±&nbsp;", on = "&nbsp;±&nbsp;", adj = "&nbsp;±&nbsp;", is_range_change = true }, ["by(x)"] = { input = " by ", output = " ×&nbsp;", out_range_x = true }, ["x"] = { off = " by ", on = " ×&nbsp;", abbr_range_x = true }, ["xx"] = "&nbsp;×&nbsp;", ["*"] = "×", ["/"] = "&thinsp;/&thinsp;", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}} } local range_aliases = { -- ["alternative name for a range"] = "standard range name" ["–"] = "-", ["&ndash;"] = "-", ["×"] = "x", ["&times;"] = "x", ["±"] = "+/-", ["&plusmn;"] = "+/-", } -- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}. -- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}. -- Words must be in correct order for searching, for example, 'x' after 'xx'. local range_words = { '-', '–', 'xx', 'x', '*' } local ranges = { types = range_types, aliases = range_aliases, words = range_words, } -- Valid option names. local en_option_name = { -- ["local text for option name"] = "en name used in this module" ["$"] = "$", ["abbr"] = "abbr", ["adj"] = "adj", ["altitude_ft"] = "altitude_ft", ["altitude_m"] = "altitude_m", ["comma"] = "comma", ["debug"] = "debug", ["disp"] = "disp", ["frac"] = "frac", ["input"] = "input", ["lang"] = "lang", ["link"] = "lk", ["lk"] = "lk", ["order"] = "order", ["qid"] = "qid", ["qual"] = "qual", ["qualifier"] = "qual", ["round"] = "round", ["sigfig"] = "sigfig", ["sing"] = "adj", -- "sing" is an old alias for "adj" ["sortable"] = "sortable", ["sp"] = "sp", ["spell"] = "spell", ["stylein"] = "stylein", ["styleout"] = "styleout", ["tracking"] = "tracking", } -- Valid option values. -- Convention: parms.opt_xxx refers to an option that is set here -- (not intended to be set by the template which invokes this module). -- Example: At enwiki, "abbr" includes: -- ["values"] = "opt_values" -- As a result, if the template uses abbr=values, Module:Convert sets: -- parms["opt_values"] = true -- parms["abbr"] = nil -- Therefore parms.abbr will be nil, or will have one of the listed values -- that do not start with "opt_". -- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated. -- Options removed in January 2018 with remnants still in Module:Convert: -- abbr=mos (in a range, repeat the input unit) -- adj=1 (set opt_singular to make the unit name singular when 0 < abs(value) <= 1) local en_option_value = { ["$"] = 'TEXT', -- TEXT should be a currency symbol that will be used instead of "$" ["abbr"] = { -- ["local text for option value"] = "en value used in this module" ["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation") ["h"] = "on", -- abbr=on + use "h" for hand unit (default) ["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit ["in"] = "in", -- use symbol for LHS unit ["none"] = "off", -- old name for "off" ["off"] = "off", -- use name for all units ["on"] = "on", -- use symbol for all units ["out"] = "out", -- use symbol for RHS unit (default) ["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km) ["values"] = "opt_values", -- show only input and output numbers, not units ["~"] = "opt_also_symbol", -- show input unit symbol as well as name }, ["adj"] = { ["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output) ["off"] = "", -- ignored (off is the default) ["on"] = "opt_adjectival", -- unit name is singular and hyphenated ["pre"] = "opt_one_preunit", -- user-specified text before input unit ["ri0"] = "opt_ri=0", -- round input with precision = 0 ["ri1"] = "opt_ri=1", -- round input with precision = 1 ["ri2"] = "opt_ri=2", -- round input with precision = 2 ["ri3"] = "opt_ri=3", -- round input with precision = 3 ["~"] = "opt_also_symbol", -- same as abbr=~ so can have {{convert|1|C|K|abbr=off|adj=~}} }, ["altitude_ft"] = 'INTEGER', ["altitude_m"] = 'INTEGER', ["comma"] = { ["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits ["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits ["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark ["off"] = "opt_nocomma", -- no numsep in input or output numbers }, ["debug"] = { ["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible }, ["disp"] = { ["5"] = "opt_round=5?", -- round output value to nearest 5 ["b"] = "b", -- join: '(...)' ["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination ["br"] = "br", -- join: '<br />' ["br()"] = "br()", -- join: '<br />(...)' ["comma"] = "comma", -- join: ',' ["flip"] = "opt_flip", -- reverse order of input/output ["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name) ["or"] = "or", -- join: 'or' ["out"] = "opt_output_only", ["output number only"] = "opt_output_number_only", ["output only"] = "opt_output_only", ["preunit"] = "opt_two_preunits", -- user-specified text before input and output units ["semicolon"] = "semicolon", -- join: ';' ["sqbr"] = "sqbr", -- join: '[...]' ["table"] = "opt_table", -- output is suitable for a table cell with align="right" ["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center" ["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value) ["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known ["unit2"] = "opt_output_unit_only", ["x"] = "x", -- join: <first>...<second> (user-specified text) }, ["frac"] = 'INTEGER', ["input"] = 'TEXT', -- TEXT should be <value><space><unitcode> or <wikidata-property-id> ["lang"] = { -- language for output digits (both en and local digits are always accepted for input) ["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language ["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en) }, ["lk"] = { ["in"] = "in", -- link LHS unit name or symbol ["off"] = "off", -- do not link: same as default except for hand unit ["on"] = "on", -- link all unit names or symbols (but not twice for the same unit) ["out"] = "out", -- link RHS unit name or symbol }, ["order"] = { ["flip"] = "opt_flip", -- reverse order of input/output ["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input }, ["qid"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier ["qual"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier ["round"] = { ["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5 ["5"] = "opt_round=5", -- round output value to nearest 5 ["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1") ["25"] = "opt_round=25", -- round output value to nearest 25 ["50"] = "opt_round=50", -- round output value to nearest 50 ["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range) }, ["sigfig"] = 'INTEGER', ["sortable"] = { ["off"] = "", -- ignored (off is the default) ["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit ["debug"] = "opt_sortable_on, opt_sortable_debug", -- |sortable=debug is the same as |sortable=on|debug=yes }, ["sp"] = { ["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre") }, ["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions ["in"] = "opt_spell_in", -- spell input value in words ["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase ["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words ["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase ["us"] = "opt_sp_us", -- use U.S. spelling; same as sp=us so spell=us also works }, ["stylein"] = 'TEXT', ["styleout"] = 'TEXT', ["tracking"] = 'TEXT', } local titles = { ["frac"] = "Fraction/styles.css", ["sfrac"] = "Sfrac/styles.css", } return { SIprefixes = SIprefixes, all_categories = all_categories, all_messages = all_messages, currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true }, customary_units = customary_units, disp_joins = disp_joins, en_option_name = en_option_name, en_option_value = en_option_value, eng_scales = eng_scales, ranges = ranges, titles = titles, } d9f24f7b3c125178aa827b8e2b4ad1e7ba143f48 Template:Sfrac 10 729 1121 2025-02-27T18:27:09Z wikipedia>Great Brightstar 0 Additional fix wikitext text/x-wiki {{ {{{|safesubst:}}}#invoke:Unsubst||$B=<templatestyles src="Sfrac/styles.css" /><span class="sfrac">&NoBreak;{{#if:{{{3|}}}|{{{1}}}<span class="sr-only">+</span>}}<!-- --><span class="tion" {{#if:{{{font-size|}}}|style="font-size:{{{font-size}}}"}}><!-- --><span class="num">{{#if:{{{3|}}}|{{{2}}}|{{#if:{{{2|}}}|{{{1}}}|1}}}}</span><!-- --><span class="sr-only">/</span><!-- --><span class="den">{{{3|{{{2|{{{1|1}}}}}}}}}</span><!-- --></span><!-- -->&NoBreak;</span>}}<noinclude> {{documentation}} <!-- Add categories to /doc subpage, not here. --> </noinclude> 1a4f22ed67a613ab0f1d9abf9816187efc00f50a Module:Hatnote 828 338 443 2025-03-18T15:47:33Z wikipedia>Ahecht 0 Revert Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules. -- -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local yesno -- lazily initialise [[Module:Yesno]] local formatLink -- lazily initialise [[Module:Format link]] ._formatLink local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end function p.defaultClasses(inline) -- Provides the default hatnote classes as a space-separated string; useful -- for hatnote-manipulation modules like [[Module:Hatnote group]]. return (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' .. 'navigation-not-searchable' end function p.disambiguate(page, disambiguator) -- Formats a page title with a disambiguation parenthetical, -- i.e. "Example" → "Example (disambiguation)". checkType('disambiguate', 1, page, 'string') checkType('disambiguate', 2, disambiguator, 'string', true) disambiguator = disambiguator or 'disambiguation' return mw.ustring.format('%s (%s)', page, disambiguator) end function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to false. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end function p.makeWikitextError(msg, helpLink, addTrackingCategory, title) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- [[Module:Yesno]], and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') title = title or mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' ([[' .. helpLink .. '|help]])' else helpText = '' end -- Make the category text. local category if not title.isTalkPage -- Don't categorise talk pages and title.namespace ~= 2 -- Don't categorise userspace and yesno(addTrackingCategory) ~= false -- Allow opting out then category = 'Hatnote templates with errors' category = mw.ustring.format( '[[%s:%s]]', mw.site.namespaces[14].name, category ) else category = '' end return mw.ustring.format( '<strong class="error">Error: %s%s.</strong>%s', msg, helpText, category ) end local curNs = mw.title.getCurrentTitle().namespace p.missingTargetCat = --Default missing target category, exported for use in related modules ((curNs == 0) or (curNs == 14)) and 'Articles with hatnote templates targeting a nonexistent page' or nil function p.quote(title) --Wraps titles in quotation marks. If the title starts/ends with a quotation --mark, kerns that side as with {{-'}} local quotationMarks = { ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true } local quoteLeft, quoteRight = -- Test if start/end are quotation marks quotationMarks[string.sub(title, 1, 1)], quotationMarks[string.sub(title, -1, -1)] if quoteLeft or quoteRight then title = mw.html.create("span"):wikitext(title) end if quoteLeft then title:css("padding-left", "0.15em") end if quoteRight then title:css("padding-right", "0.15em") end return '"' .. tostring(title) .. '"' end -------------------------------------------------------------------------------- -- Hatnote -- -- Produces standard hatnote text. Implements the {{hatnote}} template. -------------------------------------------------------------------------------- p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end function p.hatnote(frame) local args = getArgs(frame) local s = args[1] if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end return p._hatnote(s, { extraclasses = args.extraclasses, selfref = args.selfref }) end function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) options = options or {} local inline = options.inline local hatnote = mw.html.create(inline == 1 and 'span' or 'div') local extraclasses if type(options.extraclasses) == 'string' then extraclasses = options.extraclasses end hatnote :attr('role', 'note') :addClass(p.defaultClasses(inline)) :addClass(extraclasses) :addClass(options.selfref and 'selfref' or nil) :wikitext(s) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' } } .. tostring(hatnote) end return p e4b658e3483374de2bebf772f3d19aaa713ca3f5 Module:Val 828 718 1099 2025-06-01T05:39:35Z wikipedia>Johnuniq 0 change 0.3em spacing to 0.225em (same total space as old code) per [[Template talk:Val#Proposal to reduce spacing around ±]] Scribunto text/plain -- For Template:Val, output a number and optional unit. -- Format options include scientific and uncertainty notations. local numdot = '.' -- decimal mark (use ',' for Italian) local numsep = ',' -- group separator (use ' ' for Italian) local mtext = { -- Message and other text that should be localized. ['mt-bad-exponent'] = 'exponent parameter (<b>e</b>)', ['mt-parameter'] = 'parameter ', ['mt-not-number'] = 'is not a valid number', ['mt-cannot-range'] = 'cannot use a range if the first parameter includes "e"', ['mt-need-range'] = 'needs a range in parameter 2', ['mt-should-range'] = 'should be a range', ['mt-cannot-with-e'] = 'cannot be used if the first parameter includes "e"', ['mt-not-range'] = 'does not accept a range', ['mt-cannot-e'] = 'cannot use e notation', ['mt-too-many-parameter'] = 'too many parameters', ['mt-need-number'] = 'need a number after the last parameter because it is a range.', ['mt-ignore-parameter4'] = 'Val parameter 4 ignored', ['mt-val-not-supported'] = 'Val parameter "%s=%s" is not supported', ['mt-invalid-scale'] = 'Unit "%s" has invalid scale "%s"', ['mt-both-u-ul'] = 'unit (<b>u</b>) and unit with link (<b>ul</b>) are both specified, only one is allowed.', ['mt-both-up-upl'] = 'unit per (<b>up</b>) and unit per with link (<b>upl</b>) are both specified, only one is allowed.', } local data_module = 'Module:Val/units' local convert_module = 'Module:Convert' local function valerror(msg, nocat, iswarning) -- Return formatted message text for an error or warning. -- Can append "#FormattingError" to URL of a page with a problem to find it. local anchor = '<span id="FormattingError"></span>' local body, category if nocat or mw.title.getCurrentTitle():inNamespaces(1, 2, 3, 5) then -- No category in Talk, User, User_talk, or Wikipedia_talk. category = '' else category = '[[Category:Pages with incorrect formatting templates use]]' end iswarning = false -- problems are infrequent so try showing large error so editor will notice if iswarning then body = '<sup class="noprint Inline-Template" style="white-space:nowrap;">' .. '[[Template:Val|<span title="' .. msg:gsub('"', '&quot;') .. '">warning</span>]]</sup>' else body = '<strong class="error">' .. 'Error in &#123;&#123;[[Template:val|val]]&#125;&#125;: ' .. msg .. '</strong>' end return anchor .. body .. category end local range_types = { -- No need for '&nbsp;' because nowrap applies to all output. [","] = ", ", ["by"] = " by ", ["-"] = "–", ["–"] = "–", ["and"] = " and ", ["or"] = " or " , ["to"] = " to " , ["x"] = " × ", ["×"] = " × ", ["/"] = "/", } local range_repeat_unit = { -- WP:UNIT wants unit repeated when a "multiply" range is used. ["x"] = true, ["×"] = true, } local function extract_item(index, numbers, arg) -- Extract an item from arg and store the result in numbers[index]. -- If no argument or if argument is valid, return nil (no error); -- otherwise, return an error message. -- The stored result is: -- * a table for a number (empty if there was no specified number); or -- * a string for range text -- Input like 1e3 is regarded as invalid for all except argument 1 -- which accepts e notation as an alternative to the 'e' argument. -- Input group separators are removed. local which = index local function fail(msg) local description if which == 'e' then description = mtext['mt-bad-exponent'] else description = mtext['mt-parameter'] .. which end return description .. ' ' .. (msg or mtext['mt-not-number']) .. '.' end local result = {} local range = range_types[arg] if range then if type(index) == 'number' and (index % 2 == 0) then if index == 2 then if numbers[1] and numbers[1].exp then return fail(mtext['mt-cannot-range']) end numbers.has_ranges = true else if not numbers.has_ranges then return fail(mtext['mt-need-range']) end end numbers[index] = range if range_repeat_unit[arg] then -- Any "repeat" range forces unit (if any) to be repeated for all items. numbers.isrepeat = true end return nil end return fail(mtext['mt-not-range']) end if numbers.has_ranges and type(index) == 'number' and (index % 2 == 0) then return fail(mtext['mt-should-range']) end if index == 'e' then local e = numbers[1] and numbers[1].exp if e then if arg then return fail(mtext['mt-cannot-with-e']) end arg = e which = 1 end end if arg and arg ~= '' then arg = arg:gsub(numsep, '') if numdot ~= '.' then arg = arg:gsub(numdot, '.') end if arg:sub(1, 1) == '(' and arg:sub(-1) == ')' then result.parens = true arg = arg:sub(2, -2) end local a, b = arg:match('^(.+)[Ee](.+)$') if a then if index == 1 then arg = a result.exp = b else return fail(mtext['mt-cannot-e']) end end local isnegative, propersign, prefix local minus = '−' prefix, arg = arg:match('^(.-)([%d.]+)$') local value = tonumber(arg) if not value then return fail() end if arg:sub(1, 1) == '.' then arg = '0' .. arg end if prefix == '' then -- Ignore. elseif prefix == '±' then -- Display for first number, ignore for others. if index == 1 then propersign = '±' end elseif prefix == '+' then propersign = '+' elseif prefix == '-' or prefix == minus then propersign = minus isnegative = true else return fail() end result.clean = arg result.sign = propersign or '' result.value = isnegative and -value or value end numbers[index] = result return nil -- no error end local function get_args(numbers, args) -- Extract arguments and store the results in numbers. -- Return nothing (no error) if ok; otherwise, return an error message. for index = 1, 99 do local which = index local arg = args[which] -- has been trimmed if not arg then which = 'e' arg = args[which] end local msg = extract_item(which, numbers, arg) if msg then return msg end if which == 'e' then break end if index > 19 then return mtext['mt-too-many-parameter'] end end if numbers.has_ranges and (#numbers % 2 == 0) then return mtext['mt-need-number'] end end local function get_scale(text, ucode) -- Return the value of text as a number, or throw an error. -- This supports extremely basic expressions of the form: -- a / b -- a ^ b -- where a and b are numbers or 'pi'. local n = tonumber(text) if n then return n end n = text:gsub('pi', math.pi) for _, op in ipairs({ '/', '^' }) do local a, b = n:match('^(.-)' .. op .. '(.*)$') if a then a = tonumber(a) b = tonumber(b) if a and b then if op == '/' then return a / b elseif op == '^' then return a ^ b end end break end end error(string.format(mtext['mt-invalid-scale'], ucode, text)) end local function get_builtin_unit(ucode, definitions) -- Return table of information for the specified built-in unit, or nil if not known. -- Each defined unit code must be followed by two spaces (not tab characters). local _, pos = definitions:find('\n' .. ucode .. ' ', 1, true) if pos then local endline = definitions:find('%s*\n', pos) if endline then local result = {} local n = 0 local text = definitions:sub(pos + 1, endline - 1):gsub('%s%s+', '\t') for item in (text .. '\t'):gmatch('(%S.-)\t') do if item == 'ALIAS' then result.alias = true elseif item == 'ANGLE' then result.isangle = true result.nospace = true elseif item == 'NOSPACE' then result.nospace = true elseif item == 'SI' then result.si = true else n = n + 1 if n == 1 then local link, symbol = item:match('^%[%[([^|]+)|(.+)%]%]$') if link then result.symbol = symbol result.link = link n = 2 else result.symbol = item end elseif n == 2 then result.link = item elseif n == 3 then result.scale_text = item result.scale = get_scale(item, ucode) else result.more_ignored = item break end end end if result.si then local s = result.symbol if ucode == 'mc' .. s or ucode == 'mu' .. s then result.ucode = 'µ' .. s -- unit code for convert should be this end end if n >= 2 or (n >= 1 and result.alias) then return result end -- Ignore invalid definition, treating it as a comment. end end end local function convert_lookup(ucode, value, scaled_top, want_link, si, options) local lookup = require(convert_module)._unit return lookup(ucode, { value = value, scaled_top = scaled_top, link = want_link, si = si, sort = options.sortable, }) end local function get_unit(ucode, value, scaled_top, options) local want_link = options.want_link if scaled_top then want_link = options.want_per_link end local data = mw.loadData(data_module) local result = options.want_longscale and get_builtin_unit(ucode, data.builtin_units_long_scale) or get_builtin_unit(ucode, data.builtin_units) local si, use_convert if result then if result.alias then ucode = result.symbol use_convert = true end if result.scale then -- Setting si means convert will use the unit as given, and the sort key -- will be calculated from the value without any extra scaling that may -- occur if convert found the unit code. For example, if val defines the -- unit 'year' with a scale and if si were not set, convert would also apply -- its own scale because convert knows that a year is 31,557,600 seconds. si = { result.symbol, result.link } value = value * result.scale end if result.si then ucode = result.ucode or ucode si = { result.symbol, result.link } use_convert = true end else result = {} use_convert = true end local convert_unit = convert_lookup(ucode, value, scaled_top, want_link, si, options) result.sortkey = convert_unit.sortspan if use_convert then result.text = convert_unit.text result.scaled_top = convert_unit.scaled_value else if want_link then result.text = '[[' .. result.link .. '|' .. result.symbol .. ']]' else result.text = result.symbol end result.scaled_top = value end return result end local function makeunit(value, options) -- Return table of information for the requested unit and options, or -- return nil if no unit. options = options or {} local unit local ucode = options.u local percode = options.per if ucode then unit = get_unit(ucode, value, nil, options) elseif percode then unit = { nospace = true, scaled_top = value } else return nil end local text = unit.text or '' local sortkey = unit.sortkey if percode then local function bracketed(code, text) return code:find('[*./]') and '(' .. text .. ')' or text end local perunit = get_unit(percode, 1, unit.scaled_top, options) text = (ucode and bracketed(ucode, text) or '') .. '/' .. bracketed(percode, perunit.text) sortkey = perunit.sortkey end if not (unit.nospace or options.nospace) then text = '&nbsp;' .. text end return { text = text, isangle = unit.isangle, sortkey = sortkey } end local function list_units(mode) -- Return wikitext to list the built-in units. -- A unit code should not contain wikimarkup so don't bother escaping. local data = mw.loadData(data_module) local definitions = data.builtin_units .. data.builtin_units_long_scale local last_was_blank = true local n = 0 local result = {} local function add(line) if line == '' then last_was_blank = true else if last_was_blank and n > 0 then n = n + 1 result[n] = '' end last_was_blank = false n = n + 1 result[n] = line end end local si_prefixes = { -- These are the prefixes recognized by convert; u is accepted for micro. y = 'y', z = 'z', a = 'a', f = 'f', p = 'p', n = 'n', u = 'µ', ['µ'] = 'µ', m = 'm', c = 'c', d = 'd', da = 'da', h = 'h', k = 'k', M = 'M', G = 'G', T = 'T', P = 'P', E = 'E', Z = 'Z', Y = 'Y', } local function is_valid(ucode, unit) if unit and not unit.more_ignored then assert(type(unit.symbol) == 'string' and unit.symbol ~= '') if unit.alias then if unit.link or unit.scale_text or unit.si then return false end end if unit.si then if unit.scale_text then return false end ucode = unit.ucode or ucode local base = unit.symbol if ucode == base then unit.display = base return true end local plen = #ucode - #base if plen > 0 then local prefix = si_prefixes[ucode:sub(1, plen)] if prefix and ucode:sub(plen + 1) == base then unit.display = prefix .. base return true end end else unit.display = unit.symbol return true end end return false end local lookup = require(convert_module)._unit local function show_convert(ucode, unit) -- If a built-in unit defines a scale or sets the SI flag, any unit defined in -- convert is not used (the scale or SI prefix's scale is used for a sort key). -- If there is no scale or SI flag, and the unit is not defined in convert, -- the sort key may not be correct; this allows such units to be identified. if not (unit.si or unit.scale_text) then if mode == 'convert' then unit.show = not lookup(unit.alias and unit.symbol or ucode).unknown unit.show_text = 'CONVERT' elseif mode == 'unknown' then unit.show = lookup(unit.alias and unit.symbol or ucode).unknown unit.show_text = 'UNKNOWN' elseif not unit.alias then -- Show convert's scale in square brackets ('[1]' for an unknown unit). -- Don't show scale for an alias because it's misleading for temperature -- and an alias is probably not useful for anything else. local scale = lookup(ucode, {value=1, sort='on'}).scaled_value if type(scale) == 'number' then scale = string.format('%.5g', scale):gsub('e%+?(%-?)0*(%d+)', 'e%1%2') else scale = '?' end unit.show = true unit.show_text = '[' .. scale .. ']' end end end for line in definitions:gmatch('([^\n]*)\n') do local pos, _ = line:find(' ', 1, true) if pos then local ucode = line:sub(1, pos - 1) local unit = get_builtin_unit(ucode, '\n' .. line .. '\n') if is_valid(ucode, unit) then show_convert(ucode, unit) local flags, text if unit.alias then text = unit.symbol else text = '[[' .. unit.link .. '|' .. unit.display .. ']]' end if unit.isangle then unit.nospace = nil -- don't show redundant flag end for _, f in ipairs({ { 'alias', 'ALIAS' }, { 'isangle', 'ANGLE' }, { 'nospace', 'NOSPACE' }, { 'si', 'SI' }, { 'scale_text', unit.scale_text }, { 'show', unit.show_text }, }) do if unit[f[1]] then local t = f[2] if t:match('^%u+$') then t = '<small>' .. t .. '</small>' end if flags then flags = flags .. ' ' .. t else flags = t end end end if flags then text = text .. ' • ' .. flags end add(ucode .. ' = ' .. text .. '<br />') else add(line .. ' ◆ <b>invalid definition</b><br />') end else add(line) end end return table.concat(result, '\n') end local delimit_groups = require('Module:Gapnum').groups local function delimit(sign, numstr, fmt) -- Return sign and numstr (unsigned digits or numdot only) after formatting. -- Four-digit integers are not formatted with gaps. fmt = (fmt or ''):lower() if fmt == 'none' or (fmt == '' and #numstr == 4 and numstr:match('^%d+$')) then return sign .. numstr end -- Group number by integer and decimal parts. -- If there is no decimal part, delimit_groups returns only one table. local ipart, dpart = delimit_groups(numstr) local result if fmt == 'commas' then result = sign .. table.concat(ipart, numsep) if dpart then result = result .. numdot .. table.concat(dpart) end else -- Delimit with a small gap by default. local groups = {} groups[1] = table.remove(ipart, 1) for _, v in ipairs(ipart) do table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>') end if dpart then table.insert(groups, numdot .. (table.remove(dpart, 1) or '')) for _, v in ipairs(dpart) do table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>') end end result = sign .. table.concat(groups) end return result end local function sup_sub(sup, sub, align) -- Return the same result as Module:Su except val defaults to align=right. if align == 'l' or align == 'left' then align = 'left' elseif align == 'c' or align == 'center' then align = 'center' else align = 'right' end return '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:' .. align .. ';">' .. sup .. '<br />' .. sub .. '</span>' end local function range_text(items, unit_table, options) local fmt = options.fmt local nend = items.nend or '' if items.isrepeat or unit_table.isangle then nend = nend .. unit_table.text end local text = '' for i = 1, #items do if i % 2 == 0 then text = text .. items[i] else text = text .. delimit(items[i].sign, items[i].clean, fmt) .. nend end end return text end local function uncertainty_text(uncertainty, unit_table, options) local angle, text, need_parens if unit_table.isangle then angle = unit_table.text end local upper = uncertainty.upper or {} local lower = uncertainty.lower or {} local uncU = upper.clean if uncU then local fmt = options.fmt local uncL = lower.clean if uncL then uncU = delimit('+', uncU, fmt) .. (upper.errend or '') uncL = delimit('−', uncL, fmt) .. (lower.errend or '') if angle then uncU = uncU .. angle uncL = uncL .. angle end text = (angle or '') .. '<span style="margin-left:0.3em;">' .. sup_sub(uncU, uncL, options.align) .. '</span>' else if upper.parens then text = '(' .. uncU .. ')' -- old template did not delimit else text = (angle or '') .. '<span style="margin-left:0.225em;margin-right:0.225em;">±</span>' .. delimit('', uncU, fmt) need_parens = true end if uncertainty.errend then text = text .. uncertainty.errend end if angle then text = text .. angle end end else if angle then text = angle end end return text, need_parens end local function _main(values, unit_spec, options) if options.sandbox then data_module = data_module .. '/sandbox' convert_module = convert_module .. '/sandbox' end local action = options.action if action then if action == 'list' then -- Kludge: am using the align parameter (a=xxx) for type of list. return list_units(options.align) end return valerror('invalid action "' .. action .. '".', options.nocat) end local number = values.number or (values.numbers and values.numbers[1]) or {} local e_10 = options.e or {} local novalue = (number.value == nil and e_10.clean == nil) local fmt = options.fmt local want_sort = true local sortable = options.sortable if sortable == 'off' or (sortable == nil and novalue) then want_sort = false elseif sortable == 'debug' then -- Same as sortable = 'on' but the sort key is displayed. else sortable = 'on' end local sort_value = 1 if want_sort then sort_value = number.value or 1 if e_10.value and sort_value ~= 0 then -- The 'if' avoids {{val|0|e=1234}} giving an invalid sort_value due to overflow. sort_value = sort_value * 10^e_10.value end end local unit_table = makeunit(sort_value, { u = unit_spec.u, want_link = unit_spec.want_link, per = unit_spec.per, want_per_link = unit_spec.want_per_link, nospace = novalue, want_longscale = unit_spec.want_longscale, sortable = sortable, }) local sortkey if unit_table then if want_sort then sortkey = unit_table.sortkey end else unit_table = { text = '' } if want_sort then sortkey = convert_lookup('dummy', sort_value, nil, nil, nil, { sortable = sortable }).sortspan end end local final_unit = unit_table.isangle and '' or unit_table.text local e_text, n_text, need_parens local uncertainty = values.uncertainty if uncertainty then if number.clean then n_text = delimit(number.sign, number.clean, fmt) .. (number.nend or '') local text text, need_parens = uncertainty_text(uncertainty, unit_table, options) if text then n_text = n_text .. text end else n_text = '' end else if values.numbers.isrepeat then final_unit = '' end n_text = range_text(values.numbers, unit_table, options) need_parens = true end if e_10.clean then if need_parens then n_text = '(' .. n_text .. ')' end e_text = '10<sup>' .. delimit(e_10.sign, e_10.clean, fmt) .. '</sup>' if number.clean then e_text = '<span style="margin-left:0.25em;margin-right:0.15em;">×</span>' .. e_text end else e_text = '' end local result = (sortkey or '') .. (options.prefix or '') .. n_text .. e_text .. final_unit .. (options.suffix or '') if result ~= '' then result = '<span class="nowrap">' .. result .. '</span>' end return result .. (options.warning or '') end local function check_parameters(args, has_ranges, nocat) -- Return warning text for the first problem parameter found, or nothing if ok. local whitelist = { a = true, action = true, debug = true, e = true, ['end'] = true, errend = true, ['+errend'] = true, ['-errend'] = true, fmt = true, ['long scale'] = true, long_scale = true, longscale = true, nocategory = true, p = true, s = true, sortable = true, u = true, ul = true, up = true, upl = true, } for k, v in pairs(args) do if type(k) == 'string' and not whitelist[k] then local warning = string.format(mtext['mt-val-not-supported'], k, v) return valerror(warning, nocat, true) end end if not has_ranges and args[4] then return valerror(mtext['mt-ignore-parameter4'], nocat, true) end end local function main(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame, {wrappers = { 'Template:Val' }}) local nocat = args.nocategory local numbers = {} -- table of number tables, perhaps with range text local msg = get_args(numbers, args) if msg then return valerror(msg, nocat) end if args.u and args.ul then return valerror(mtext['mt-both-u-ul'], nocat) end if args.up and args.upl then return valerror(mtext['mt-both-up-upl'], nocat) end local values if numbers.has_ranges then -- Multiple values with range separators but no uncertainty. numbers.nend = args['end'] values = { numbers = numbers, } else -- A single value with optional uncertainty. local function setfield(i, dst, src) local v = args[src] if v then if numbers[i] then numbers[i][dst] = v else numbers[i] = { [dst] = v } end end end setfield(1, 'nend', 'end') setfield(2, 'errend', '+errend') setfield(3, 'errend', '-errend') values = { number = numbers[1], uncertainty = { upper = numbers[2], lower = numbers[3], errend = args.errend, } } end local unit_spec = { u = args.ul or args.u, want_link = args.ul ~= nil, per = args.upl or args.up, want_per_link = args.upl ~= nil, want_longscale = (args.longscale or args.long_scale or args['long scale']) == 'on', } local options = { action = args.action, align = args.a, e = numbers.e, fmt = args.fmt, nocat = nocat, prefix = args.p, sandbox = string.find(frame:getTitle(), 'sandbox', 1, true) ~= nil, sortable = args.sortable or (args.debug == 'yes' and 'debug' or nil), suffix = args.s, warning = check_parameters(args, numbers.has_ranges, nocat), } return _main(values, unit_spec, options) end return { main = main, _main = _main } 6a50e544e78223a89c0b012cb5fc6de86419edf8 Module:Val/units 828 719 1101 2025-06-23T22:02:44Z wikipedia>MSGJ 0 remove superfluous space Scribunto text/plain -- Definitions for units known to val -- File format is two strings and a return statement with them in it: -- string in quotes [=[ ... builtin_units ... ]=]. -- string in quotes [=[ ... builtin_units_long_scale ... ]=]. -- First string, builtin_units, is short-scale, second string is long scale. -- Entry format: -- One record per line, starting in first column, having 2-4 fields. -- Field separator: two or more spaces -- Between first and second fields: two or more spaces -- Between all other fields: two or more spaces, or one or more tabs -- Entries without two spaces in them are ignored. -- There must be a blank line before the first entry and after the last. -- I.e. the first two and last two characters of the string must be newlines. -- Format of entry. Two record types: -- -- One record type is a wikilink: -- Unit-code [[ pagename | Symbol-accepts-HTML-only ]] -- Text-field separator is still two spaces. Two spaces not allowed in wikilink. -- -- The other record type is all fields: -- Unit-code symbol-accepts-HTML-only pagename#section-OK -- -- Plus there is an optional field that goes at the end after two or more spaces. -- Whether it is a number or an equation or the letters SI, -- any of these three has the same function: a wikitable sorting "scale". -- It is for sorting, and it works for either record type. -- Difference is SI can't accept HTML. But SI correctly scales any SI prefix. -- (Optional fields ALIAS and NOSPACE and ANGLE are for advanced users.) -- "Invalid unit" error: -- Using SI requires that the symbol equal unit-code, so never allows HTML. -- Any difference between SI or symbol must be an SI prefix, such as k, M, or G. -- A space at the end of an entry is an error. No space at each EOL. local builtin_units = [=[ == Test == Foo [[Hz|<samp>Foo</samp>]] Baz [[Hertz|baz<sub>0</sub>]] Baz [[Kelvins|baz<sub>0</sub>]] Bar [[Foobar|bar<abbr title="super duper">0</abbr>]] quux [[Foobar|<span title="super duper 2">bar0</span>]] == Unsorted units == c0 [[Speed of light#Numerical value, notation, and units|''c''<sub>0</sub>]] lbf [[Pound (force)|<span title="pound-force">lb<sub>F</sub></span>]] N.s [[Newton-second|N&sdot;s]] J.K-1 [[Joule per kelvin|J&sdot;K<sup>−1</sup>]] C.mol-1 [[Faraday constant|C&sdot;mol<sup>−1</sup>]] C/mol [[Faraday constant|C/mol]] C.kg-1 [[Roentgen (unit)|C&sdot;kg<sup>−1</sup>]] C/kg [[Roentgen (unit)|C/kg]] F.m-1 [[vacuum permittivity|F&sdot;m<sup>−1</sup>]] F/m [[vacuum permittivity|F/m]] e [[Elementary charge|''e'']] kB [[Kilobyte|kB]] 8e3 KB [[Kilobyte|KB]] 8e3 MB [[Megabyte|MB]] 8e6 GB [[Gigabyte|GB]] 8e9 TB [[Terabyte|TB]] 8e12 lx [[Lux (unit)|lx]] nat [[nat (unit)|nat]] == Time and frequency == byte/s [[Data rate units|byte/s]] 8 kB/s [[Data rate units#Kilobyte per second|<span title="Kilobytes per second">kB/s</span>]] 8e3 MB/s [[Data rate units#Megabyte per second|<span title="Megabytes per second">MB/s</span>]] 8e6 GB/s [[Data rate units#Gigabyte per second|<span title="Gigabytes per second">GB/s</span>]] 8e9 TB/s [[Data rate units#Terabyte per second|<span title="Terabytes per second">TB/s</span>]] 8e12 bit/s [[Bit per second|bit/s]] 1 bps [[Bit per second|bit/s]] 1 kbit/s [[Kilobit per second|kbit/s]] 1e3 Mbit/s [[Megabit per second|Mbit/s]] 1e6 Gbit/s [[Gigabit per second|Gbit/s]] 1e9 Tbit/s [[Terabit per second|Tbit/s]] 1e12 kT/s [[Transfer (computing)|<span title="Kilotransfers per second">kT/s</span>]] 1e3 MT/s [[Transfer (computing)|<span title="Megatransfers per second">MT/s</span>]] 1e6 GT/s [[Transfer (computing)|<span title="Gigatransfers per second">GT/s</span>]] 1e9 year [[Year|year]] 31557600 years [[Year|years]] 31557600 yr [[Year#Symbols and abbreviations|yr]] 31557600 y [[Year|y]] 31557600 a [[Annum|a]] 31557600 Ga [[Gigaannum|Ga]] 31557600000000000 Ma [[Megaannum|Ma]] 31557600000000 ka [[Kiloannum|ka]] 31557600000 kyr [[kyr|kyr]] 31557600000 kya [[kyr|kya]] 31557600000 myr [[myr|myr]] 31557600000000 mya [[Mya (unit)|mya]] 31557600000000 byr [[Billion years|byr]] 31557600000000000 bya [[Billion years ago|bya]] 31557600000000000 Gyr [[billion years|Gyr]] 31557600000000000 BP [[Before present|BP]] uBP [[Radiocarbon dating#Calibration|<sup>14</sup>C yr BP]] BC [[Before Christ|BC]] -1 AD [[Anno Domini|AD]] 1 BCE [[Before the Common Era|BCE]] -1 CE [[Common Era|CE]] 1 JD [[Julian date|JD]] 1 MJD [[Modified Julian date|MJD]] 1 s-1 [[Second|s<sup>−1</sup>]] s-2 [[Second|s<sup>−2</sup>]] s2 [[Second|s<sup>2</sup>]] s [[Second|s]] SI as [[Attosecond|s]] SI cs [[Second|s]] SI das [[Second|s]] SI ds [[Second|s]] SI Es [[Second|s]] SI fs [[Femtosecond|s]] SI Gs [[Second|s]] SI hs [[Second|s]] SI ks [[Second|s]] SI ms [[Millisecond|s]] SI µs [[Microsecond|s]] SI us [[Microsecond|s]] SI Ms [[Second|s]] SI ns [[Nanosecond|s]] SI ps [[Picosecond|s]] SI Ps [[Second|s]] SI Ts [[Second|s]] SI Ys [[Second|s]] SI ys [[Yoctosecond|s]] SI Zs [[Second|s]] SI zs [[Zeptosecond|s]] SI Hz [[Hertz|Hz]] SI aHz [[Hertz|Hz]] SI cHz [[Hertz|Hz]] SI daHz [[Hertz|Hz]] SI dHz [[Hertz|Hz]] SI EHz [[Hertz|Hz]] SI fHz [[Hertz|Hz]] SI hHz [[Hertz|Hz]] SI GHz [[Gigahertz|Hz]] SI kHz [[Kilohertz|Hz]] SI MHz [[Megahertz|Hz]] SI mHz [[Hertz|Hz]] SI uHz [[Hertz|Hz]] SI µHz [[Hertz|Hz]] SI nHz [[Hertz|Hz]] SI pHz [[Hertz|Hz]] SI PHz [[Hertz|Hz]] SI THz [[Hertz|Hz]] SI yHz [[Hertz|Hz]] SI YHz [[Hertz|Hz]] SI zHz [[Hertz|Hz]] SI ZHz [[Hertz|Hz]] SI ips [[Inch per second|ips]] == Length, area, volume == Å3 [[Ångström|Å<sup>3</sup>]] fb-1 [[Barn (unit)#Inverse femtobarn|fb<sup>−1</sup>]] m-1 [[Metre|m<sup>−1</sup>]] m-2 [[Square metre|m<sup>−2</sup>]] m-3 [[Cubic metre|m<sup>−3</sup>]] km2 [[Square kilometre|km<sup>2</sup>]] km3 [[Cubic kilometre|km<sup>3</sup>]] µm2 [[Square metre|µm<sup>2</sup>]] um2 [[Square metre|µm<sup>2</sup>]] am2 [[Square metre|am<sup>2</sup>]] cm2 [[Square centimetre|cm<sup>2</sup>]] dam2 [[Square metre|dam<sup>2</sup>]] dm2 [[Square metre|dm<sup>2</sup>]] Em2 [[Square metre|Em<sup>2</sup>]] fm2 [[Square metre|fm<sup>2</sup>]] Gm2 [[Square metre|Gm<sup>2</sup>]] hm2 [[Square metre|hm<sup>2</sup>]] mm2 [[Square metre|mm<sup>2</sup>]] Mm2 [[Square metre|Mm<sup>2</sup>]] nm2 [[Square metre|nm<sup>2</sup>]] pm2 [[Square metre|pm<sup>2</sup>]] Pm2 [[Square metre|Pm<sup>2</sup>]] Tm2 [[Square metre|Tm<sup>2</sup>]] ym2 [[Square metre|ym<sup>2</sup>]] Ym2 [[Square metre|Ym<sup>2</sup>]] zm2 [[Square metre|zm<sup>2</sup>]] Zm2 [[Square metre|Zm<sup>2</sup>]] gal [[Gallon|gal]] Gal [[Gal (unit)|Gal]] uGal [[Gal (unit)|µGal]] µGal [[Gal (unit)|µGal]] mGal [[Gal (unit)|mGal]] b [[Barn (unit)|b]] SI ab [[Barn (unit)|b]] SI cb [[Barn (unit)|b]] SI dab [[Barn (unit)|b]] SI db [[Barn (unit)|b]] SI Eb [[Barn (unit)|b]] SI fb [[Barn (unit)|b]] SI Gb [[Barn (unit)|b]] SI hb [[Barn (unit)|b]] SI kb [[Barn (unit)|b]] SI mb [[Barn (unit)|b]] SI µb [[Barn (unit)|b]] SI ub [[Barn (unit)|b]] SI Mb [[Barn (unit)|b]] SI nb [[Barn (unit)|b]] SI pb [[Barn (unit)|b]] SI Pb [[Barn (unit)|b]] SI Tb [[Barn (unit)|b]] SI Yb [[Barn (unit)|b]] SI yb [[Barn (unit)|b]] SI Zb [[Barn (unit)|b]] SI zb [[Barn (unit)|b]] SI == Velocity and acceleration == m.s-2 [[Metre per second squared|m&sdot;s<sup>−2</sup>]] m/s2 [[Metre per second squared|m/s<sup>2</sup>]] m.s-1 [[Metre per second|m&sdot;s<sup>−1</sup>]] m/s [[Metre per second|m/s]] km.s-1 [[Metre per second|km&sdot;s<sup>−1</sup>]] km/s [[Metre per second|km/s]] == Mass and energy == lbm [[Pound (mass)|<span title="pound-mass">lb<sub>m</sub></span>]] uJ [[Joule|µJ]] J.s [[Joule-second|J&sdot;s]] kWh [[Kilowatt hour|kWh]] kW.h [[Kilowatt hour|kW&sdot;h]] J/C [[Volt|J/C]] J/kg [[Joule|J/kg]] Da [[Dalton (unit)|Da]] SI EDa [[Dalton (unit)|Da]] SI PDa [[Dalton (unit)|Da]] SI TDa [[Dalton (unit)|Da]] SI GDa [[Dalton (unit)|Da]] SI MDa [[Dalton (unit)|Da]] SI kDa [[Dalton (unit)|Da]] SI mDa [[Dalton (unit)|Da]] SI uDa [[Dalton (unit)|Da]] SI μDa [[Dalton (unit)|Da]] SI nDa [[Dalton (unit)|Da]] SI pDa [[Dalton (unit)|Da]] SI fDa [[Dalton (unit)|Da]] SI aDa [[Dalton (unit)|Da]] SI g [[Gram|g]] SI ag [[Attogram|g]] SI cg [[Centigram|g]] SI dag [[Gram|g]] SI dg [[Decigram|g]] SI Eg [[Exagram|g]] SI fg [[Femtogram|g]] SI Gg [[Gigagram|g]] SI hg [[Kilogram#SI multiples|g]] SI kg [[Kilogram|g]] SI mcg [[Microgram|g]] SI Mg [[Megagram|g]] SI mg [[Milligram|g]] SI ug [[Microgram|g]] SI µg [[Microgram|g]] SI ng [[Nanogram|g]] SI Pg [[Petagram|g]] SI pg [[Picogram|g]] SI Tg [[Tonne|g]] SI yg [[Yoctogram|g]] SI Yg [[Yottagram|g]] SI zg [[Zeptogram|g]] SI Zg [[Zettagram|g]] SI == Pressure and density == psi [[Pounds per square inch|psi]] g.cm-3 [[Gram per cubic centimetre|g&sdot;cm<sup>−3</sup>]] g/cm3 [[Gram per cubic centimetre|g/cm<sup>3</sup>]] kg.m-3 [[Kilogram per cubic metre|kg&sdot;m<sup>−3</sup>]] kg/m3 [[Kilogram per cubic metre|kg/m<sup>3</sup>]] kg/cm3 [[Density#Formula and common units|kg/cm<sup>3</sup>]] g/L [[Gram per litre|g/L]] g/l [[Gram per litre|g/l]] mcg/dL [[Gram per litre|µg/dL]] mcg/dl [[Gram per litre|µg/dl]] mg/mL [[Gram per litre|mg/mL]] mg/ml [[Gram per litre|mg/ml]] ug/dL [[Gram per litre|µg/dL]] ug/dl [[Gram per litre|µg/dl]] μg/dL [[Gram per litre|μg/dL]] μg/dl [[Gram per litre|μg/dl]] mg.L-1 [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]] mg/L [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]] mg.l-1 [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]] mg/l [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]] == Fracture toughness == MPa.m.5 [[Fracture toughness|MPa&sdot;m<sup>1/2</sup>]] kPa.m.5 [[Fracture toughness|kPa&sdot;m<sup>1/2</sup>]] Pa.m.5 [[Fracture toughness|Pa&sdot;m<sup>1/2</sup>]] == Temperature == degC °C ALIAS degF °F ALIAS degR °R ALIAS K [[Kelvin|K]] SI YK [[Yottakelvin|K]] SI ZK [[Zettakelvin|K]] SI EK [[Kelvin|K]] SI PK [[Petakelvin|K]] SI TK [[Terakelvin|K]] SI GK [[Gigakelvin|K]] SI MK [[Megakelvin|K]] SI kK [[Kilokelvin|K]] SI hK [[Hectokelvin|K]] SI daK [[Decakelvin|K]] SI dK [[Decikelvin|K]] SI cK [[Centikelvin|K]] SI mK [[Millikelvin|K]] SI µK [[Microkelvin|K]] SI uK [[Microkelvin|K]] SI nK [[Nanokelvin|K]] SI pK [[Picokelvin|K]] SI fK [[Femtokelvin|K]] SI aK [[Attokelvin|K]] SI zK [[Zeptokelvin|K]] SI yK [[Yoctokelvin|K]] SI == Electromagnetism == Wb [[Weber (unit)|Wb]] N.A-2 [[Permeability (electromagnetism)|N&sdot;A<sup>−2</sup>]] H.m-1 [[Permeability (electromagnetism)|H&sdot;m<sup>−1</sup>]] V.m-1 [[Electric field|V&sdot;m<sup>−1</sup>]] V/m [[Electric field|V/m]] C [[Coulomb|C]] SI YC [[Coulomb|C]] SI ZC [[Coulomb|C]] SI EC [[Coulomb|C]] SI PC [[Coulomb|C]] SI TC [[Coulomb|C]] SI GC [[Coulomb|C]] SI MC [[Coulomb|C]] SI kC [[Coulomb|C]] SI hC [[Coulomb|C]] SI daC [[Coulomb|C]] SI dC [[Coulomb|C]] SI cC [[Coulomb|C]] SI mC [[Coulomb|C]] SI µC [[Coulomb|C]] SI uC [[Coulomb|C]] SI nC [[Coulomb|C]] SI pC [[Coulomb|C]] SI fC [[Coulomb|C]] SI aC [[Coulomb|C]] SI zC [[Coulomb|C]] SI yC [[Coulomb|C]] SI F [[Farad|F]] SI YF [[Farad|F]] SI ZF [[Farad|F]] SI EF [[Farad|F]] SI PF [[Farad|F]] SI TF [[Farad|F]] SI GF [[Farad|F]] SI MF [[Farad|F]] SI kF [[Farad|F]] SI hF [[Farad|F]] SI daF [[Farad|F]] SI dF [[Farad|F]] SI cF [[Farad|F]] SI mF [[Farad|F]] SI µF [[Farad|F]] SI uF [[Farad|F]] SI nF [[Farad|F]] SI pF [[Farad|F]] SI fF [[Farad|F]] SI aF [[Farad|F]] SI zF [[Farad|F]] SI yF [[Farad|F]] SI H [[Henry (unit)|H]] SI YH [[Henry (unit)|H]] SI ZH [[Henry (unit)|H]] SI EH [[Henry (unit)|H]] SI PH [[Henry (unit)|H]] SI TH [[Henry (unit)|H]] SI GH [[Henry (unit)|H]] SI MH [[Henry (unit)|H]] SI kH [[Henry (unit)|H]] SI hH [[Henry (unit)|H]] SI daH [[Henry (unit)|H]] SI dH [[Henry (unit)|H]] SI cH [[Henry (unit)|H]] SI mH [[Henry (unit)|H]] SI µH [[Henry (unit)|H]] SI uH [[Henry (unit)|H]] SI nH [[Henry (unit)|H]] SI pH [[Henry (unit)|H]] SI fH [[Henry (unit)|H]] SI aH [[Henry (unit)|H]] SI zH [[Henry (unit)|H]] SI yH [[Henry (unit)|H]] SI A [[Ampere|A]] SI YA [[Ampere|A]] SI ZA [[Ampere|A]] SI EA [[Ampere|A]] SI PA [[Ampere|A]] SI TA [[Ampere|A]] SI GA [[Ampere|A]] SI MA [[Ampere|A]] SI kA [[Ampere|A]] SI hA [[Ampere|A]] SI daA [[Ampere|A]] SI dA [[Ampere|A]] SI cA [[Ampere|A]] SI mA [[Ampere|A]] SI µA [[Ampere|A]] SI uA [[Ampere|A]] SI nA [[Ampere|A]] SI pA [[Ampere|A]] SI fA [[Ampere|A]] SI aA [[Ampere|A]] SI zA [[Ampere|A]] SI yA [[Ampere|A]] SI V [[Volt|V]] SI YV [[Volt|V]] SI ZV [[Volt|V]] SI EV [[Volt|V]] SI PV [[Volt|V]] SI TV [[Volt|V]] SI GV [[Volt|V]] SI MV [[Volt|V]] SI kV [[Volt|V]] SI hV [[Volt|V]] SI daV [[Volt|V]] SI dV [[Volt|V]] SI cV [[Volt|V]] SI mV [[Volt|V]] SI µV [[Volt|V]] SI uV [[Volt|V]] SI nV [[Volt|V]] SI pV [[Volt|V]] SI fV [[Volt|V]] SI aV [[Volt|V]] SI zV [[Volt|V]] SI yV [[Volt|V]] SI VA [[Volt-ampere|VA]] SI YVA [[Volt-ampere|VA]] SI ZVA [[Volt-ampere|VA]] SI EVA [[Volt-ampere|VA]] SI PVA [[Volt-ampere|VA]] SI TVA [[Volt-ampere|VA]] SI GVA [[Volt-ampere|VA]] SI MVA [[Volt-ampere|VA]] SI kVA [[Volt-ampere|VA]] SI hVA [[Volt-ampere|VA]] SI daVA [[Volt-ampere|VA]] SI dVA [[Volt-ampere|VA]] SI cVA [[Volt-ampere|VA]] SI mVA [[Volt-ampere|VA]] SI µVA [[Volt-ampere|VA]] SI uVA [[Volt-ampere|VA]] SI nVA [[Volt-ampere|VA]] SI pVA [[Volt-ampere|VA]] SI fVA [[Volt-ampere|VA]] SI aVA [[Volt-ampere|VA]] SI zVA [[Volt-ampere|VA]] SI yVA [[Volt-ampere|VA]] SI Ω [[Ohm|Ω]] SI YΩ.m [[Electrical resistivity and conductivity#Definition|YΩ&sdot;m]] 1e24 ZΩ.m [[Electrical resistivity and conductivity#Definition|ZΩ&sdot;m]] 1e21 EΩ.m [[Electrical resistivity and conductivity#Definition|EΩ&sdot;m]] 1e18 PΩ.m [[Electrical resistivity and conductivity#Definition|PΩ&sdot;m]] 1e15 TΩ.m [[Electrical resistivity and conductivity#Definition|TΩ&sdot;m]] 1e12 GΩ.m [[Electrical resistivity and conductivity#Definition|GΩ&sdot;m]] 1e9 MΩ.m [[Electrical resistivity and conductivity#Definition|MΩ&sdot;m]] 1e6 kΩ.m [[Electrical resistivity and conductivity#Definition|kΩ&sdot;m]] 1e3 Ω.m [[Electrical resistivity and conductivity#Definition|Ω&sdot;m]] 1 mΩ.m [[Electrical resistivity and conductivity#Definition|mΩ&sdot;m]] 1e-3 µΩ.m [[Electrical resistivity and conductivity#Definition|µΩ&sdot;m]] 1e-6 uΩ.m [[Electrical resistivity and conductivity#Definition|µΩ&sdot;m]] 1e-6 nΩ.m [[Electrical resistivity and conductivity#Definition|nΩ&sdot;m]] 1e-9 pΩ.m [[Electrical resistivity and conductivity#Definition|pΩ&sdot;m]] 1e-12 fΩ.m [[Electrical resistivity and conductivity#Definition|fΩ&sdot;m]] 1e-15 aΩ.m [[Electrical resistivity and conductivity#Definition|aΩ&sdot;m]] 1e-18 zΩ.m [[Electrical resistivity and conductivity#Definition|zΩ&sdot;m]] 1e-21 yΩ.m [[Electrical resistivity and conductivity#Definition|yΩ&sdot;m]] 1e-24 R [[Rayleigh (unit)|R]] SI G [[Gauss (unit)|G]] SI aG [[Attogauss|G]] SI cG [[Centigauss|G]] SI daG [[Decagauss|G]] SI dG [[Decigauss|G]] SI EG [[Exagauss|G]] SI fG [[Femtogauss|G]] SI GG [[Gigagauss|G]] SI hG [[Hectogauss|G]] SI kG [[Kilogauss|G]] SI MG [[Megagauss|G]] SI mG [[Milligauss|G]] SI uG [[Microgauss|G]] SI µG [[Microgauss|G]] SI nG [[Nanogauss|G]] SI PG [[Petagauss|G]] SI pG [[Picogauss|G]] SI TG [[Teragauss|G]] SI yG [[Yoctogauss|G]] SI YG [[Yottagauss|G]] SI zG [[Zeptogauss|G]] SI ZG [[Zettagauss|G]] SI T [[Tesla (unit)|T]] SI aT [[Attotesla|T]] SI cT [[Centitesla|T]] SI daT [[Decatesla|T]] SI dT [[Decitesla|T]] SI ET [[Exatesla|T]] SI fT [[Femtotesla|T]] SI GT [[Gigatesla|T]] SI hT [[Hectotesla|T]] SI kT [[Kilotesla|T]] SI MT [[Megatesla|T]] SI mT [[Millitesla|T]] SI uT [[Microtesla|T]] SI µT [[Microtesla|T]] SI nT [[Nanotesla|T]] SI PT [[Petatesla|T]] SI pT [[Picotesla|T]] SI TT [[Teratesla|T]] SI yT [[Yoctotesla|T]] SI YT [[Yottatesla|T]] SI zT [[Zeptotesla|T]] SI ZT [[Zettatesla|T]] SI == Astrophysics == au [[Astronomical unit|au]] c [[Speed of light|''c'']] ly [[Light-year|ly]] Earth mass [[Earth mass|''M''<sub>🜨</sub>]] Earth radius [[Earth radius|''R''<sub>🜨</sub>]] M_Earth [[Earth mass|''M''<sub>🜨</sub>]] R_Earth [[Earth radius|''R''<sub>🜨</sub>]] M+ [[Earth mass|''M''<sub>🜨</sub>]] R+ [[Earth radius|''R''<sub>🜨</sub>]] Jupiter mass [[Jupiter mass|''M''<sub>J</sub>]] Jupiter radius [[Jupiter radius|''R''<sub>J</sub>]] Jy [[Jansky|Jy]] M_Jupiter [[Jupiter mass|''M''<sub>J</sub>]] R_Jupiter [[Jupiter radius|''R''<sub>J</sub>]] Solar mass [[Solar mass|''M''<sub>&#x2609;</sub>]] solar mass [[Solar mass|''M''<sub>&#x2609;</sub>]] M_Solar [[Solar mass|''M''<sub>&#x2609;</sub>]] M_solar [[Solar mass|''M''<sub>&#x2609;</sub>]] R_Solar [[Solar radius|''R''<sub>&#x2609;</sub>]] R_solar [[Solar radius|''R''<sub>&#x2609;</sub>]] Solar radius [[Solar radius|''R''<sub>&#x2609;</sub>]] solar radius [[Solar radius|''R''<sub>&#x2609;</sub>]] Solar luminosity [[Solar luminosity|''L''<sub>&#x2609;</sub>]] solar luminosity [[Solar luminosity|''L''<sub>&#x2609;</sub>]] L_solar [[Solar luminosity|''L''<sub>&#x2609;</sub>]] L_Solar [[Solar luminosity|''L''<sub>&#x2609;</sub>]] Lo [[Solar luminosity|''L''<sub>&#x2609;</sub>]] pc2 [[Parsec|pc<sup>2</sup>]] pc3 [[Parsec|pc<sup>3</sup>]] kpc2 [[Parsec#Parsecs and kiloparsecs|kpc<sup>2</sup>]] kpc3 [[Parsec#Parsecs and kiloparsecs|kpc<sup>3</sup>]] kpc [[Parsec#Parsecs and kiloparsecs|kpc]] Mpc2 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>2</sup>]] Mpc3 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>3</sup>]] Mpc [[Parsec#Megaparsecs and gigaparsecs|Mpc]] Gpc2 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>2</sup>]] Gpc3 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>3</sup>]] Gpc [[Parsec#Megaparsecs and gigaparsecs|Gpc]] == Nuclear physics and chemistry == cm-1 [[Wavenumber|cm<sup>−1</sup>]] u [[Unified atomic mass unit|u]] osmol [[Osmole (unit)|osmol]] Osm [[Osmole (unit)|Osm]] M [[Molarity|M]] TM [[Molarity|M]] SI GM [[Molarity|M]] SI MM [[Molarity|M]] SI kM [[Molarity|M]] SI hM [[Molarity|M]] SI daM [[Molarity|M]] SI dM [[Molarity|M]] SI cM [[Molarity|M]] SI mM [[Molarity|M]] SI uM [[Molarity|M]] 1e-6 nM [[Molarity|M]] SI pM [[Molarity|M]] SI kg.mol-1 [[Molar mass|kg&sdot;mol<sup>−1</sup>]] kg/mol [[Molar mass|kg/mol]] g.mol-1 [[Molar mass|g&sdot;mol<sup>−1</sup>]] g/mol [[Molar mass|g/mol]] eV/c2 [[Electronvolt#Mass|eV/''c''<sup>2</sup>]] keV/c2 [[Electronvolt#Mass|keV/''c''<sup>2</sup>]] MeV/c2 [[Electronvolt#Mass|MeV/''c''<sup>2</sup>]] GeV/c2 [[Electronvolt#Mass|GeV/''c''<sup>2</sup>]] TeV/c2 [[Electronvolt#Mass|TeV/''c''<sup>2</sup>]] eV [[Electronvolt|eV]] meV [[Electronvolt|meV]] keV [[Electronvolt|keV]] MeV [[Electronvolt|MeV]] GeV [[Electronvolt|GeV]] TeV [[Electronvolt|TeV]] mol-1 [[Avogadro constant|mol<sup>−1</sup>]] J.mol-1 [[Joule per mole|J&sdot;mol<sup>−1</sup>]] J/mol [[Joule per mole|J/mol]] kJ.mol-1 [[Joule per mole|kJ&sdot;mol<sup>−1</sup>]] kJ/mol [[Joule per mole|kJ/mol]] MJ.mol-1 [[Joule per mole|MJ&sdot;mol<sup>−1</sup>]] MJ/mol [[Joule per mole|MJ/mol]] GJ.mol-1 [[Joule per mole|GJ&sdot;mol<sup>−1</sup>]] GJ/mol [[Joule per mole|GJ/mol]] TJ.mol-1 [[Joule per mole|TJ&sdot;mol<sup>−1</sup>]] TJ/mol [[Joule per mole|TJ/mol]] μB [[Bohr magneton|''μ''<sub>B</sub>]] == Numbers and phrases == pp [[Page (paper)|pp]] ppb [[Parts per billion|ppb]] 1e-9 ppm [[Parts per million|ppm]] 1e-6 billiard [[Orders of magnitude (numbers)#1015|billiard]] 1e15 billion [[1,000,000,000|billion]] 1e9 billionth [[1,000,000,000|billionth]] 1e-9 billionths [[1,000,000,000|billionths]] 1e-9 decilliard [[Orders of magnitude (numbers)#1063|decilliard]] 1e63 decillion [[Orders of magnitude (numbers)#1033|decillion]] 1e33 decillionth [[Orders of magnitude (numbers)#1033|decillionth]] 1e-33 decillionths [[Orders of magnitude (numbers)#1033|decillionths]] 1e-33 milliard [[1,000,000,000|milliard]] 1e9 million [[Million|million]] 1e6 millionth [[Million|millionth]] 1e-6 millionths [[Million|millionths]] 1e-6 nonilliard [[Orders of magnitude (numbers)#1057|nonilliard]] 1e57 nonillion [[Orders of magnitude (numbers)#1030|nonillion]] 1e30 nonillionth [[Orders of magnitude (numbers)#1030|nonillionth]] 1e-30 nonillionths [[Orders of magnitude (numbers)#1030|nonillionths]] 1e-30 octilliard [[Orders of magnitude (numbers)#1051|octilliard]] 1e51 octillion [[Orders of magnitude (numbers)#1027|octillion]] 1e27 octillionth [[Orders of magnitude (numbers)#1027|octillionth]] 1e-27 octillionths [[Orders of magnitude (numbers)#1027|octillionths]] 1e-27 quadrilliard [[Orders of magnitude (numbers)#1027|quadrilliard]] 1e27 quadrillion [[Orders of magnitude (numbers)#1015|quadrillion]] 1e15 quadrillionth [[Orders of magnitude (numbers)#1015|quadrillionth]] 1e-15 quadrillionths [[Orders of magnitude (numbers)#1015|quadrillionths]] 1e-15 quintilliard [[Orders of magnitude (numbers)#1033|quintilliard]] 1e33 quintillion [[Orders of magnitude (numbers)#1018|quintillion]] 1e18 quintillionth [[Orders of magnitude (numbers)#1018|quintillionth]] 1e-18 quintillionths [[Orders of magnitude (numbers)#1018|quintillionths]] 1e-18 septilliard [[Orders of magnitude (numbers)#1045|septilliard]] 1e45 septillion [[Orders of magnitude (numbers)#1024|septillion]] 1e24 septillionth [[Orders of magnitude (numbers)#1024|septillionth]] 1e-24 septillionths [[Orders of magnitude (numbers)#1024|septillionths]] 1e-24 sextilliard [[Orders of magnitude (numbers)#1039|sextilliard]] 1e39 sextillion [[Orders of magnitude (numbers)#1021|sextillion]] 1e21 sextillionth [[Orders of magnitude (numbers)#1021|sextillionth]] 1e-21 sextillionths [[Orders of magnitude (numbers)#1021|sextillionths]] 1e-21 trilliard [[Orders of magnitude (numbers)#1021|trilliard]] 1e21 trillion [[Orders of magnitude (numbers)#1012|trillion]] 1e12 trillionth [[Orders of magnitude (numbers)#1012|trillionth]] 1e-12 trillionths [[Orders of magnitude (numbers)#1012|trillionths]] 1e-12 == Angles == % % Percent ANGLE 0.01 percent % Percent ANGLE 0.01 per cent % Percent ANGLE 0.01 ‰ ‰ Per mil ANGLE 1e-3 per mil ‰ Per mil ANGLE 1e-3 per mill ‰ Per mil ANGLE 1e-3 per mille ‰ Per mil ANGLE 1e-3 permil ‰ Per mil ANGLE 1e-3 permill ‰ Per mil ANGLE 1e-3 permille ‰ Per mil ANGLE 1e-3 ° ° Degree (angle) ANGLE pi/180 deg ° Degree (angle) ANGLE pi/180 degree ° Degree (angle) NOSPACE pi/180 -- for a degree symbol that does not repeat ' ′ Minute of arc ANGLE pi/10800 ′ ′ Minute of arc ANGLE pi/10800 arcmin ′ Minute of arc ANGLE pi/10800 arcminute ′ Minute of arc ANGLE pi/10800 " ″ Second of arc ANGLE pi/648000 ″ ″ Second of arc ANGLE pi/648000 arcsec ″ Second of arc ANGLE pi/648000 arcsecond ″ Second of arc ANGLE pi/648000 mas [[Milliarcsecond|mas]] pi/648000000 ]=] -- If val has "|long scale=on" the following definitions are used -- (then, if not found here, the normal definitions are used). -- Unit code [[Link|Symbol]] Flags/Scale local builtin_units_long_scale = [=[ == Long scale numbers and phrases == billion [[Orders of magnitude (numbers)#1012|billion]] 1e12 billionth [[Orders of magnitude (numbers)#1012|billionth]] 1e-12 billionths [[Orders of magnitude (numbers)#1012|billionths]] 1e-12 decillion [[Orders of magnitude (numbers)#1060|decillion]] 1e60 decillionth [[Orders of magnitude (numbers)#1060|decillionth]] 1e-60 decillionths [[Orders of magnitude (numbers)#1060|decillionths]] 1e-60 nonillion [[Orders of magnitude (numbers)#1054|nonillion]] 1e54 nonillionth [[Orders of magnitude (numbers)#1054|nonillionth]] 1e-54 nonillionths [[Orders of magnitude (numbers)#1054|nonillionths]] 1e-54 octillion [[Orders of magnitude (numbers)#1048|octillion]] 1e48 octillionth [[Orders of magnitude (numbers)#1048|octillionth]] 1e-48 octillionths [[Orders of magnitude (numbers)#1048|octillionths]] 1e-48 quadrillion [[Orders of magnitude (numbers)#1024|quadrillion]] 1e24 quadrillionth [[Orders of magnitude (numbers)#1024|quadrillionth]] 1e-24 quadrillionths [[Orders of magnitude (numbers)#1024|quadrillionths]] 1e-24 quintillion [[Orders of magnitude (numbers)#1030|quintillion]] 1e30 quintillionth [[Orders of magnitude (numbers)#1030|quintillionth]] 1e-30 quintillionths [[Orders of magnitude (numbers)#1030|quintillionths]] 1e-30 septillion [[Orders of magnitude (numbers)#1042|septillion]] 1e42 septillionth [[Orders of magnitude (numbers)#1042|septillionth]] 1e-42 septillionths [[Orders of magnitude (numbers)#1042|septillionths]] 1e-42 sextillion [[Orders of magnitude (numbers)#1036|sextillion]] 1e36 sextillionth [[Orders of magnitude (numbers)#1036|sextillionth]] 1e-36 sextillionths [[Orders of magnitude (numbers)#1036|sextillionths]] 1e-36 trillion [[Orders of magnitude (numbers)#1018|trillion]] 1e18 trillionth [[Orders of magnitude (numbers)#1018|trillionth]] 1e-18 trillionths [[Orders of magnitude (numbers)#1018|trillionths]] 1e-18 ]=] return { builtin_units = builtin_units, builtin_units_long_scale = builtin_units_long_scale } 2307ae0d1410328f2d5ace7ab494855c5cb9c9e9 Module:Convert/extra 828 725 1113 2025-07-02T08:58:47Z wikipedia>Johnuniq 0 try "per-km2" workaround per [[Template talk:Convert#per km²]] Scribunto text/plain -- Extra conversion data used by Module:Convert. -- -- [[Module:Convert/data]] defines all units and is transcluded in all pages -- where [[Module:Convert]] is used. Testing new units by editing that module -- would invalidate the cache for all affected pages. -- -- For quick changes and experiments with new units, this module can be edited. -- Since this module is transcluded in only a small number of pages, changes -- should cause little server overhead and should propagate quickly. -- -- If a unit is defined in the data module, any definition here is ignored, -- so defining the same unit in both modules is not an error. -- A unit defined here can refer to units that are also defined here, and -- can refer to units defined in the data module. -- -- Periodically, those extra units that are wanted permanently can be removed -- from here after being added to [[Module:Convert/data]]. local extra_units = { ["bit"] = { _name1 = "bit", _symbol = "bit", utype = "information", scale = 0.125, prefixes = 1, default = "B", link = "Bit", }, ["per-km2"] = { name1 = "per square kilometre", name1_us = "per square kilometer", name2 = "per square kilometre", name2_us = "per square kilometer", symbol = "per&nbsp;km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "/sqmi", link = "Square kilometre", }, } return { extra_units = extra_units } 55a4ac716545a8687a16e661345c64dca7597848 Category:Dual Wields 14 469 702 2025-07-13T14:44:26Z Sharparam 284703 Initial page wikitext text/x-wiki [[Category:Weapons]] febdf29cf9dcbef034e184720fe19a5ac5f353d8 Category:Weapons 14 468 700 2025-07-13T14:45:01Z Sharparam 284703 Initial page wikitext text/x-wiki '''Weapons''' are equipment the player can use to damage monsters and defend themselves. 98e971be059993e01129097dd2602abe573ed443 Sharp 0 526 812 2025-07-13T14:49:25Z Sharparam 284703 Initial page wikitext text/x-wiki '''Sharp''' is a type of damage in {{BFF}}. 791f7c953da43e2ac6ebe338f36d863e32d3ac49 Module:Math 828 534 828 2025-07-13T14:59:23Z Sharparam 284703 Initial page copied from [[wikipedia:Module:Math]] Scribunto text/plain --[[ This module provides a number of basic mathematical operations. ]] local yesno, getArgs -- lazily initialized local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules. local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua. --[[ Helper functions used to avoid redundant code. ]] local function err(msg) -- Generates wikitext error messages. return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg) end local function unpackNumberArgs(args) -- Returns an unpacked list of arguments specified with numerical keys. local ret = {} for k, v in pairs(args) do if type(k) == 'number' then table.insert(ret, v) end end return unpack(ret) end local function makeArgArray(...) -- Makes an array of arguments from a list of arguments that might include nils. local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs. local nums = {} -- Stores the numbers of valid numerical arguments. local ret = {} for k, v in pairs(args) do v = p._cleanNumber(v) if v then nums[#nums + 1] = k args[k] = v end end table.sort(nums) for i, num in ipairs(nums) do ret[#ret + 1] = args[num] end return ret end local function fold(func, ...) -- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters, -- and must return a number as an output. This number is then supplied as input to the next function call. local vals = makeArgArray(...) local count = #vals -- The number of valid arguments if count == 0 then return -- Exit if we have no valid args, otherwise removing the first arg would cause an error. nil, 0 end local ret = table.remove(vals, 1) for _, val in ipairs(vals) do ret = func(ret, val) end return ret, count end --[[ Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value). ]] local function binary_fold(func, ...) local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...) return value end --[[ random Generate a random number Usage: {{#invoke: Math | random }} {{#invoke: Math | random | maximum value }} {{#invoke: Math | random | minimum value | maximum value }} ]] function wrap.random(args) local first = p._cleanNumber(args[1]) local second = p._cleanNumber(args[2]) return p._random(first, second) end function p._random(first, second) math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000)) -- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params. if first and second then if first <= second then -- math.random doesn't allow the first number to be greater than the second. return math.random(first, second) end elseif first then return math.random(first) else return math.random() end end --[[ order Determine order of magnitude of a number Usage: {{#invoke: Math | order | value }} ]] function wrap.order(args) local input_string = (args[1] or args.x or '0'); local input_number = p._cleanNumber(input_string); if input_number == nil then return err('order of magnitude input appears non-numeric') else return p._order(input_number) end end function p._order(x) if x == 0 then return 0 end return math.floor(math.log10(math.abs(x))) end --[[ precision Detemines the precision of a number using the string representation Usage: {{ #invoke: Math | precision | value }} ]] function wrap.precision(args) local input_string = (args[1] or args.x or '0'); local trap_fraction = args.check_fraction; local input_number; if not yesno then yesno = require('Module:Yesno') end if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]]. local pos = string.find(input_string, '/', 1, true); if pos ~= nil then if string.find(input_string, '/', pos + 1, true) == nil then local denominator = string.sub(input_string, pos+1, -1); local denom_value = tonumber(denominator); if denom_value ~= nil then return math.log10(denom_value); end end end end input_number, input_string = p._cleanNumber(input_string); if input_string == nil then return err('precision input appears non-numeric') else return p._precision(input_string) end end function p._precision(x) if type(x) == 'number' then x = tostring(x) end x = string.upper(x) local decimal = x:find('%.') local exponent_pos = x:find('E') local result = 0; if exponent_pos ~= nil then local exponent = string.sub(x, exponent_pos + 1) x = string.sub(x, 1, exponent_pos - 1) result = result - tonumber(exponent) end if decimal ~= nil then result = result + string.len(x) - decimal return result end local pos = string.len(x); while x:byte(pos) == string.byte('0') do pos = pos - 1 result = result - 1 if pos <= 0 then return 0 end end return result end --[[ max Finds the maximum argument Usage: {{#invoke:Math| max | value1 | value2 | ... }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.max(args) return p._max(unpackNumberArgs(args)) end function p._max(...) local max_value = binary_fold((function(a, b) return a > b end), ...) if max_value then return max_value end end --[[ median Find the median of set of numbers Usage: {{#invoke:Math | median | number1 | number2 | ...}} OR {{#invoke:Math | median }} ]] function wrap.median(args) return p._median(unpackNumberArgs(args)) end function p._median(...) local vals = makeArgArray(...) local count = #vals table.sort(vals) if count == 0 then return 0 end if p._mod(count, 2) == 0 then return (vals[count/2] + vals[count/2+1])/2 else return vals[math.ceil(count/2)] end end --[[ min Finds the minimum argument Usage: {{#invoke:Math| min | value1 | value2 | ... }} OR {{#invoke:Math| min }} When used with no arguments, it takes its input from the parent frame. Note, any values that do not evaluate to numbers are ignored. ]] function wrap.min(args) return p._min(unpackNumberArgs(args)) end function p._min(...) local min_value = binary_fold((function(a, b) return a < b end), ...) if min_value then return min_value end end --[[ sum Finds the sum Usage: {{#invoke:Math| sum | value1 | value2 | ... }} OR {{#invoke:Math| sum }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.sum(args) return p._sum(unpackNumberArgs(args)) end function p._sum(...) local sums, count = fold((function(a, b) return a + b end), ...) if not sums then return 0 else return sums end end --[[ average Finds the average Usage: {{#invoke:Math| average | value1 | value2 | ... }} OR {{#invoke:Math| average }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.average(args) return p._average(unpackNumberArgs(args)) end function p._average(...) local sum, count = fold((function(a, b) return a + b end), ...) if not sum then return 0 else return sum / count end end --[[ round Rounds a number to specified precision Usage: {{#invoke:Math | round | value | precision }} --]] function wrap.round(args) local value = p._cleanNumber(args[1] or args.value or 0) local precision = p._cleanNumber(args[2] or args.precision or 0) if value == nil or precision == nil then return err('round input appears non-numeric') else return p._round(value, precision) end end function p._round(value, precision) local rescale = math.pow(10, precision or 0); return math.floor(value * rescale + 0.5) / rescale; end --[[ log10 returns the log (base 10) of a number Usage: {{#invoke:Math | log10 | x }} ]] function wrap.log10(args) return math.log10(args[1]) end --[[ mod Implements the modulo operator Usage: {{#invoke:Math | mod | x | y }} --]] function wrap.mod(args) local x = p._cleanNumber(args[1]) local y = p._cleanNumber(args[2]) if not x then return err('first argument to mod appears non-numeric') elseif not y then return err('second argument to mod appears non-numeric') else return p._mod(x, y) end end function p._mod(x, y) local ret = x % y if not (0 <= ret and ret < y) then ret = 0 end return ret end --[[ gcd Calculates the greatest common divisor of multiple numbers Usage: {{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }} --]] function wrap.gcd(args) return p._gcd(unpackNumberArgs(args)) end function p._gcd(...) local function findGcd(a, b) local r = b local oldr = a while r ~= 0 do local quotient = math.floor(oldr / r) oldr, r = r, oldr - quotient * r end if oldr < 0 then oldr = oldr * -1 end return oldr end local result, count = fold(findGcd, ...) return result end --[[ precision_format Rounds a number to the specified precision and formats according to rules originally used for {{template:Rnd}}. Output is a string. Usage: {{#invoke: Math | precision_format | number | precision }} ]] function wrap.precision_format(args) local value_string = args[1] or 0 local precision = args[2] or 0 return p._precision_format(value_string, precision) end function p._precision_format(value_string, precision) -- For access to Mediawiki built-in formatter. local lang = mw.getContentLanguage(); local value value, value_string = p._cleanNumber(value_string) precision = p._cleanNumber(precision) -- Check for non-numeric input if value == nil or precision == nil then return err('invalid input when rounding') end local current_precision = p._precision(value) local order = p._order(value) -- Due to round-off effects it is neccesary to limit the returned precision under -- some circumstances because the terminal digits will be inaccurately reported. if order + precision >= 14 then if order + p._precision(value_string) >= 14 then precision = 13 - order; end end -- If rounding off, truncate extra digits if precision < current_precision then value = p._round(value, precision) current_precision = p._precision(value) end local formatted_num = lang:formatNum(math.abs(value)) local sign -- Use proper unary minus sign rather than ASCII default if value < 0 then sign = '−' else sign = '' end -- Handle cases requiring scientific notation if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) >= 9 then value = value * math.pow(10, -order) current_precision = current_precision + order precision = precision + order formatted_num = lang:formatNum(math.abs(value)) else order = 0; end formatted_num = sign .. formatted_num -- Pad with zeros, if needed if current_precision < precision then local padding if current_precision <= 0 then if precision > 0 then local zero_sep = lang:formatNum(1.1) formatted_num = formatted_num .. zero_sep:sub(2,2) padding = precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end else padding = precision - current_precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end end -- Add exponential notation, if necessary. if order ~= 0 then -- Use proper unary minus sign rather than ASCII default if order < 0 then order = '−' .. lang:formatNum(math.abs(order)) else order = lang:formatNum(order) end formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>' end return formatted_num end --[[ divide Implements the division operator Usage: {{#invoke:Math | divide | x | y | round= | precision= }} --]] function wrap.divide(args) local x = args[1] local y = args[2] local round = args.round local precision = args.precision if not yesno then yesno = require('Module:Yesno') end return p._divide(x, y, yesno(round), precision) end function p._divide(x, y, round, precision) if y == nil or y == "" then return err("Empty divisor") elseif not tonumber(y) then if type(y) == 'string' and string.sub(y, 1, 1) == '<' then return y else return err("Not a number: " .. y) end elseif x == nil or x == "" then return err("Empty dividend") elseif not tonumber(x) then if type(x) == 'string' and string.sub(x, 1, 1) == '<' then return x else return err("Not a number: " .. x) end else local z = x / y if round then return p._round(z, 0) elseif precision then return p._round(z, precision) else return z end end end --[[ Helper function that interprets the input numerically. If the input does not appear to be a number, attempts evaluating it as a parser functions expression. ]] function p._cleanNumber(number_string) if type(number_string) == 'number' then -- We were passed a number, so we don't need to do any processing. return number_string, tostring(number_string) elseif type(number_string) ~= 'string' or not number_string:find('%S') then -- We were passed a non-string or a blank string, so exit. return nil, nil; end -- Attempt basic conversion local number = tonumber(number_string) -- If failed, attempt to evaluate input as an expression if number == nil then local success, result = pcall(mw.ext.ParserFunctions.expr, number_string) if success then number = tonumber(result) number_string = tostring(number) else number = nil number_string = nil end else number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it. number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs. if number_string:find('^%-?0[xX]') then -- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead. number_string = tostring(number) end end return number, number_string end --[[ Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments. ]] local mt = { __index = function(t, k) return function(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return wrap[k](getArgs(frame)) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed. end end } return setmetatable(p, mt) 2bbe734d898299f65412963a3c1782e9fcc4d9ca Template:Average 10 531 822 2025-07-13T15:05:57Z Sharparam 284703 Initial page copied from [[wikipedia:Template:Average]] wikitext text/x-wiki <includeonly>{{#if:{{{round|}}}|{{formatnum:{{round|{{#invoke:math|average}}|{{{round|}}}}}|R}}|{{#invoke:math|average}}}}</includeonly><noinclude>{{doc}}</noinclude> b37093608b62a3faf722c64135fc79c4498e3d5b Template:Tooltip/styles.css 10 530 820 2025-07-13T16:45:58Z Sharparam 284703 Remove protection template sanitized-css text/css .tooltip-dotted { border-bottom: 1px dotted; } .tooltip-help { cursor: help; } af2f58c266b5958cf73537f523615e9783db80ff Template:Abbr/doc 10 533 826 2025-07-13T17:12:28Z Sharparam 284703 wikitext text/x-wiki == Examples == === [[Template:Tooltip]] === * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> &rarr; {{Tooltip|text|tooltip title}} * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> &rarr; {{Tooltip|text "with" quotes|tooltip "with" quotes}} 7e8e0dc4e38c09167b11915c2ddced76bbfe4ae4 Template:Tooltip 10 529 818 2025-07-13T17:13:16Z Sharparam 284703 Fix quote handling wikitext text/x-wiki <templatestyles src="Template:Tooltip/styles.css" /><includeonly><span class="tooltip tooltip-dotted" title="{{#replace:{{{2}}}|"|&quot;}}">{{{1}}}</span></includeonly><noinclude> {{Documentation|Template:Abbr/doc}} </noinclude> 02939f9a947fe3904add1355d50d42b05211f8b9 Template:DamageRange/doc 10 528 816 2025-07-13T17:53:55Z Sharparam 284703 Add example with decimals wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> &rarr; {{DamageRange|10|20}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> &rarr; {{DamageRange|1|2}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> &rarr; {{DamageRange|69|75|type=sharp}} a5a6c8376c27ec92e876a4bf84571a621dfedbac Template:Navbox/Items 10 285 311 2025-07-13T19:43:24Z Sharparam 284703 Initial page wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = Items | group1 = Weapons | list1 = {{Navbox/Weapons|child}} }} cedb0068e5810aa53fc1e276616ba855068c2e86 Template:Infobox/Ability/doc 10 460 684 2025-07-13T21:55:40Z Sharparam 284703 wikitext text/x-wiki == Example == {{Infobox/Ability |image=SuperTux star-1.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} <syntaxhighlight lang="wikitext"> {{Infobox/Ability |image=SuperTux star-1.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} </syntaxhighlight> c5af8361e58c9662fafe1e9ae1dfbc09ff0dedf9 Module:Track listing/configuration 828 409 578 2025-07-15T00:30:16Z Sharparam 284703 Initial page Scribunto text/plain return { show_warnings = false, input_error_category = 'Track listings with input errors', collapsed_parameter_category = 'Track listings that use the collapsed parameter ', deprecated_parameter_category = 'Track listings with deprecated parameters', track_field_names = { number = true, title = true, note = true, length = true, lyrics = true, music = true, writer = true, extra = true, }, track_listing_field_names = { width = true, headline = true, all_writing = true, all_lyrics = true, all_music = true, extra_column = true, total_length = true, title_width = true, writing_width = true, lyrics_width = true, music_width = true, extra_width = true, category = true, }, deprecated_track_listing_field_names = { writing_credits = true, lyrics_credits = true, music_credits = true, }, leading_0_in_hours = "Invalid time '%s' (times in format 'h:mm:ss' cannot start with zero)", leading_0_in_minutes = "Invalid time '%s' (times in format 'mm:ss' cannot start with zero)", not_a_time = "Invalid time '%s' (times must be in a format of 'm:ss', 'mm:ss' or 'h:mm:ss')", more_than_60_minutes = "Invalid track length '%s' (if hours are specified, the number of minutes must be less than 60)", more_than_60_seconds = "Invalid track length '%s' (number of seconds must be less than 60)", tracks_written = 'All tracks are written by %s', lyrics_written_music_composed = 'All lyrics are written by $1; all music is composed by $2', lyrics_written = 'All lyrics are written by %s', music_composed = 'All music is composed by %s', track_listing_error = '<strong class="error">Track listing error: %s</strong>', deprecated_collapsed = 'Deprecated collapsed parameter in use.', title = 'Title', number = 'Number', number_abbr = 'No.', track_listing = 'Track listing', writer = 'Writer(s)', lyrics = 'Lyrics', music = 'Music', extra = '{{{extra_column}}}', length = 'Length', blank_cell = '&nbsp;', track_title = '"%s"', untitled = 'Untitled', note = ' (%s)', track_id = 'track%d', number_terminated = '%d.', total_length = 'Total length:' } 5fcb26176f1458c5fdb9b1ba7af4cafc73cbd05a Module:Track listing/styles.css 828 414 588 2025-07-15T00:30:51Z Sharparam 284703 Initial page sanitized-css text/css /* {{pp|small=y}} */ .tracklist { border-spacing: 0; } /* set on all rows we can set the total length row to transparent */ .tracklist tr { background-color: var(--background-color-base, #fff); } .tracklist tr:nth-child(2n-1) { background-color: var(--background-color-neutral-subtle, #f8f9fa); } .tracklist caption { text-align: left; font-weight: bold; } .tracklist td, .tracklist th[scope="row"] { vertical-align: top; } .tracklist th[scope="col"] { text-align: left; background-color: var(--background-color-neutral, #eaecf0); } .tracklist th.tracklist-length-header, .tracklist th.tracklist-number-header, .tracklist th[scope="row"], .tracklist-length, .tracklist-total-length td { padding-right: 10px; text-align: right; } .tracklist th[scope="row"] { font-weight: normal; } .tracklist-number-header { width: 2em; padding-left: 10px; } .tracklist-length-header { width: 4em; } .tracklist tr.tracklist-total-length { background-color: transparent; } .tracklist .tracklist-total-length th { padding: 0; font-weight: bold; } .tracklist-total-length th > span { float: right; padding: 0 10px; background-color: var(--background-color-neutral, #eaecf0); } .tracklist-total-length td { background-color: var(--background-color-neutral, #eaecf0); font-weight: bold; padding: 0 10px 0 0; } bc12ba45209a6a001e4bfaed9bda7f8aff5d3334 Module:Track listing 828 408 576 2025-07-15T00:31:18Z Sharparam 284703 Initial page Scribunto text/plain local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local cfg = mw.loadData('Module:Track listing/configuration') -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- -- Add a mixin to a class. local function addMixin(class, mixin) for k, v in pairs(mixin) do if k ~= 'init' then class[k] = v end end end -------------------------------------------------------------------------------- -- Validation mixin -------------------------------------------------------------------------------- local Validation = {} function Validation.init(self) self.warnings = {} self.categories = {} end function Validation:addWarning(msg, category) table.insert(self.warnings, msg) table.insert(self.categories, category) end function Validation:addCategory(category) table.insert(self.categories, category) end function Validation:getWarnings() return self.warnings end function Validation:getCategories() return self.categories end -- Validate a track length. If a track length is invalid, a warning is added. -- A type error is raised if the length is not of type string or nil. function Validation:validateLength(length) checkType('validateLength', 1, length, 'string', true) if length == nil then -- Do nothing if no length specified return nil end local hours, minutes, seconds -- Try to match times like "1:23:45". hours, minutes, seconds = length:match('^(%d+):(%d%d):(%d%d)$') if hours and hours:sub(1, 1) == '0' then -- Disallow times like "0:12:34" self:addWarning( string.format(cfg.leading_0_in_hours, mw.text.nowiki(length)), cfg.input_error_category ) return nil end if not seconds then -- The previous attempt didn't match. Try to match times like "1:23". minutes, seconds = length:match('^(%d?%d):(%d%d)$') if minutes and minutes:find('^0%d$') then -- Special case to disallow lengths like "01:23". This check has to -- be here so that lengths like "1:01:23" are still allowed. self:addWarning( string.format(cfg.leading_0_in_minutes, mw.text.nowiki(length)), cfg.input_error_category ) return nil end end -- Add a warning and return if we did not find a match. if not seconds then self:addWarning( string.format(cfg.not_a_time, mw.text.nowiki(length)), cfg.input_error_category ) return nil end -- Check that the minutes are less than 60 if we have an hours field. if hours and tonumber(minutes) >= 60 then self:addWarning( string.format(cfg.more_than_60_minutes, mw.text.nowiki(length)), cfg.input_error_category ) return nil end -- Check that the seconds are less than 60 if tonumber(seconds) >= 60 then self:addWarning( string.format(cfg.more_than_60_seconds, mw.text.nowiki(length)), cfg.input_error_category ) end return nil end -------------------------------------------------------------------------------- -- Track class -------------------------------------------------------------------------------- local Track = {} Track.__index = Track addMixin(Track, Validation) Track.fields = cfg.track_field_names Track.cellMethods = { number = 'makeNumberCell', title = 'makeTitleCell', writer = 'makeWriterCell', lyrics = 'makeLyricsCell', music = 'makeMusicCell', extra = 'makeExtraCell', length = 'makeLengthCell', } function Track.new(data) local self = setmetatable({}, Track) Validation.init(self) for field in pairs(Track.fields) do self[field] = data[field] end self.number = assert(tonumber(self.number)) self:validateLength(self.length) return self end function Track:getLyricsCredit() return self.lyrics end function Track:getMusicCredit() return self.music end function Track:getWriterCredit() return self.writer end function Track:getExtraField() return self.extra end -- Note: called with single dot syntax function Track.makeSimpleCell(wikitext) return mw.html.create('td') :wikitext(wikitext or cfg.blank_cell) end function Track:makeNumberCell() return mw.html.create('th') :attr('id', string.format(cfg.track_id, self.number)) :attr('scope', 'row') :wikitext(string.format(cfg.number_terminated, self.number)) end function Track:makeTitleCell() local titleCell = mw.html.create('td') titleCell:wikitext( self.title and string.format(cfg.track_title, self.title) or cfg.untitled ) if self.note then titleCell:wikitext(string.format(cfg.note, self.note)) end return titleCell end function Track:makeWriterCell() return Track.makeSimpleCell(self.writer) end function Track:makeLyricsCell() return Track.makeSimpleCell(self.lyrics) end function Track:makeMusicCell() return Track.makeSimpleCell(self.music) end function Track:makeExtraCell() return Track.makeSimpleCell(self.extra) end function Track:makeLengthCell() return mw.html.create('td') :addClass('tracklist-length') :wikitext(self.length or cfg.blank_cell) end function Track:exportRow(columns) local columns = columns or {} local row = mw.html.create('tr') for i, column in ipairs(columns) do local method = Track.cellMethods[column] if method then row:node(self[method](self)) end end return row end -------------------------------------------------------------------------------- -- TrackListing class -------------------------------------------------------------------------------- local TrackListing = {} TrackListing.__index = TrackListing addMixin(TrackListing, Validation) TrackListing.fields = cfg.track_listing_field_names TrackListing.deprecatedFields = cfg.deprecated_track_listing_field_names function TrackListing.new(data) local self = setmetatable({}, TrackListing) Validation.init(self) -- Check for deprecated arguments for deprecatedField in pairs(TrackListing.deprecatedFields) do if data[deprecatedField] then self:addCategory(cfg.deprecated_parameter_category) break end end -- Validate total length if data.total_length then self:validateLength(data.total_length) end -- Add properties for field in pairs(TrackListing.fields) do self[field] = data[field] end -- Evaluate boolean properties self.showCategories = yesno(self.category) ~= false self.category = nil -- Make track objects self.tracks = {} for i, trackData in ipairs(data.tracks or {}) do table.insert(self.tracks, Track.new(trackData)) end -- Find which of the optional columns we have. -- We could just check every column for every track object, but that would -- be no fun^H^H^H^H^H^H inefficient, so we use four different strategies -- to try and check only as many columns and track objects as necessary. do local optionalColumns = {} local columnMethods = { lyrics = 'getLyricsCredit', music = 'getMusicCredit', writer = 'getWriterCredit', extra = 'getExtraField', } local doneWriterCheck = false for i, trackObj in ipairs(self.tracks) do for column, method in pairs(columnMethods) do if trackObj[method](trackObj) then optionalColumns[column] = true columnMethods[column] = nil end end if not doneWriterCheck and optionalColumns.writer then doneWriterCheck = true optionalColumns.lyrics = nil optionalColumns.music = nil columnMethods.lyrics = nil columnMethods.music = nil end if not next(columnMethods) then break end end self.optionalColumns = optionalColumns end return self end -------------------------------------------------------------------------------- -- Function for automatic punctuation for parameters: -- all_writing, all_lyrics, all_music -- Punctuation defaults to '.' unless ':' or '.' already exist -- Automatic punctuation limited to parameter values not containing parser tags -- i.e. <ref>Text</ref>, <nowiki></nowiki>, etc. -------------------------------------------------------------------------------- function fullstop(a) if a ~= mw.text.killMarkers(mw.getCurrentFrame():preprocess(a)) or a:sub(-1,-1) == ":" or a:sub(-1,-1) == "." then return a else return a .. '.' end end function TrackListing:makeIntro() if self.all_writing then return string.format(cfg.tracks_written, fullstop(self.all_writing)) elseif self.all_lyrics and self.all_music then return mw.message.newRawMessage( cfg.lyrics_written_music_composed, self.all_lyrics, fullstop(self.all_music) ):plain() elseif self.all_lyrics then return string.format(cfg.lyrics_written, fullstop(self.all_lyrics)) elseif self.all_music then return string.format(cfg.music_composed, fullstop(self.all_music)) else return nil end end function TrackListing:renderTrackingCategories() if not self.showCategories or mw.title.getCurrentTitle().namespace ~= 0 then return '' end local ret = '' local function addCategory(cat) ret = ret .. string.format('[[Category:%s]]', cat) end for i, category in ipairs(self:getCategories()) do addCategory(category) end for i, track in ipairs(self.tracks) do for j, category in ipairs(track:getCategories()) do addCategory(category) end end return ret end function TrackListing:renderWarnings() if not cfg.show_warnings then return '' end local ret = {} local function addWarning(msg) table.insert(ret, string.format(cfg.track_listing_error, msg)) end for i, warning in ipairs(self:getWarnings()) do addWarning(warning) end for i, track in ipairs(self.tracks) do for j, warning in ipairs(track:getWarnings()) do addWarning(warning) end end return table.concat(ret, '<br>') end function TrackListing:__tostring() -- Root of the output local root = mw.html.create('div') :addClass('track-listing') local intro = self:makeIntro() if intro then root:tag('p') :wikitext(intro) :done() end -- Start of track listing table local tableRoot = mw.html.create('table') tableRoot :addClass('tracklist') -- Overall table width if self.width then tableRoot :css('width', self.width) end -- Header row if self.headline then tableRoot:tag('caption') :wikitext(self.headline or cfg.track_listing) end -- Headers local headerRow = tableRoot:tag('tr') ---- Track number headerRow :tag('th') :addClass('tracklist-number-header') :attr('scope', 'col') :tag('abbr') :attr('title', cfg.number) :wikitext(cfg.number_abbr) -- Find columns to output local columns = {'number', 'title'} if self.optionalColumns.writer then columns[#columns + 1] = 'writer' else if self.optionalColumns.lyrics then columns[#columns + 1] = 'lyrics' end if self.optionalColumns.music then columns[#columns + 1] = 'music' end end if self.optionalColumns.extra then columns[#columns + 1] = 'extra' end columns[#columns + 1] = 'length' -- Find column width local nColumns = #columns local nOptionalColumns = nColumns - 3 local titleColumnWidth = 100 if nColumns >= 5 then titleColumnWidth = 40 elseif nColumns >= 4 then titleColumnWidth = 60 end local optionalColumnWidth = ((100 - titleColumnWidth) / nOptionalColumns) .. '%' titleColumnWidth = titleColumnWidth .. '%' ---- Title column headerRow:tag('th') :attr('scope', 'col') :css('width', self.title_width or titleColumnWidth) :wikitext(cfg.title) ---- Optional headers: writer, lyrics, music, and extra local function addOptionalHeader(field, headerText, width) if self.optionalColumns[field] then headerRow:tag('th') :attr('scope', 'col') :css('width', width or optionalColumnWidth) :wikitext(headerText) end end addOptionalHeader('writer', cfg.writer, self.writing_width) addOptionalHeader('lyrics', cfg.lyrics, self.lyrics_width) addOptionalHeader('music', cfg.music, self.music_width) addOptionalHeader( 'extra', self.extra_column or cfg.extra, self.extra_width ) ---- Track length headerRow:tag('th') :addClass('tracklist-length-header') :attr('scope', 'col') :wikitext(cfg.length) -- Tracks for i, track in ipairs(self.tracks) do tableRoot:node(track:exportRow(columns)) end -- Total length if self.total_length then tableRoot :tag('tr') :addClass('tracklist-total-length') :tag('th') :attr('colspan', nColumns - 1) :attr('scope', 'row') :tag('span') :wikitext(cfg.total_length) :done() :done() :tag('td') :wikitext(self.total_length) end root:node(tableRoot) -- Warnings and tracking categories root:wikitext(self:renderWarnings()) root:wikitext(self:renderTrackingCategories()) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Track listing/styles.css' } } .. tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._main(args) -- Process numerical args so that we can iterate through them. local data, tracks = {}, {} for k, v in pairs(args) do if type(k) == 'string' then local prefix, num = k:match('^(%D.-)(%d+)$') if prefix and Track.fields[prefix] and (num == '0' or num:sub(1, 1) ~= '0') then -- Allow numbers like 0, 1, 2 ..., but not 00, 01, 02..., -- 000, 001, 002... etc. num = tonumber(num) tracks[num] = tracks[num] or {} tracks[num][prefix] = v else data[k] = v end end end data.tracks = (function (t) -- Compress sparse array local ret = {} for num, trackData in pairs(t) do trackData.number = num table.insert(ret, trackData) end table.sort(ret, function (t1, t2) return t1.number < t2.number end) return ret end)(tracks) return tostring(TrackListing.new(data)) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Track listing' }) return p._main(args) end return p ba53211a0ca356f872c9a88324fd2a6a9e8ff30a Template:Track listing 10 407 574 2025-07-15T00:32:29Z Sharparam 284703 Initial page wikitext text/x-wiki {{#invoke:Track listing|main}}<noinclude> {{documentation}} </noinclude> bef48fe7b046d2e4f4a2ed058a47e1ec3b30ed00 Bleak Faith: Forsaken Original Soundtrack 0 413 586 2025-07-15T01:49:10Z Sharparam 284703 Fix input error wikitext text/x-wiki The '''{{PAGENAME}}''' is a collection of songs that play throughout {{BFF}}. It is composed by [[Martel]] and [[Rade Vukčević]]. The soundtrack contains 44 tracks across all three discs with a combined total runtime of {{Duration|3:30:00|display=three and a half hours}}. == Songs == <!-- // Generated using the following script on the Apple Music page: (function() { const discs = document.querySelectorAll('.section--disc'); console.debug(discs); for (const disc of discs) { const header = disc.querySelector('.disc-header h2.title').textContent; const songs = disc.querySelectorAll('.songs-list .songs-list-row'); let total_length = 0; const songData = Array.from(songs).map(s => { const no = s.querySelector('.songs-list-row__song-index .songs-list-row__column-data').textContent; const title = s.querySelector('.songs-list-row__song-name').textContent; const length = s.querySelector('.songs-list-row__length').textContent; const [mins, secs] = length.split(':').map(l => Number(l)); total_length += mins * 60 + secs; return `| title${no} = ${title}\n| length${no} = ${length}`; }); const tracks = songData.join("\n\n"); const tot_hors = Math.floor(total_length / 60 / 60); const tot_mins = Math.floor((total_length - tot_hors * 60 * 60) / 60); const tot_secs = total_length % 60; const entry = `{{Track listing\n| headline = ${header}\n| total_length = ${tot_hors}:${tot_mins}:${tot_secs}\n\n${tracks}\n}}`; console.info(entry); } })(); --> {{Track listing | headline = Disc 1 | total_length = 1:49:26 | title1 = Premonitions | length1 = 3:19 | title2 = The Monastery | length2 = 8:22 | title3 = Oathsworn | length3 = 4:25 | title4 = The Imperial Siege | length4 = 3:25 | title5 = Concrete Sea | length5 = 4:32 | title6 = Sky Towers | length6 = 9:23 | title7 = Downpour | length7 = 9:12 | title8 = The Serdars | length8 = 8:59 | title9 = The Inquisition | length9 = 5:31 | title10 = The Valley | length10 = 3:34 | title11 = The Trisagion | length11 = 2:12 | title12 = Cloaca Maxima | length12 = 3:15 | title13 = The Call of the Void | length13 = 7:45 | title14 = The Machinarium | length14 = 11:36 | title15 = A Bitter Evening | length15 = 3:58 | title16 = Dreamlight | length16 = 7:32 | title17 = The Instinct | length17 = 2:27 | title18 = Recycled | length18 = 3:00 | title19 = Domus Aurea | length19 = 6:59 }} {{Track listing | headline = Disc 2 | total_length = 48:46 | title1 = Aurelian | length1 = 5:31 | title2 = Vangelian | length2 = 4:13 | title3 = Machinebirth | length3 = 4:52 | title4 = Melanion | length4 = 6:15 | title5 = Oberon | length5 = 5:10 | title6 = Serapian | length6 = 5:35 | title7 = Limitless | length7 = 4:54 | title8 = The Fade | length8 = 2:42 | title9 = Wandering | length9 = 4:50 | title10 = Machinedream | length10 = 4:44 }} {{Track listing | headline = Disc 3 | total_length = 52:11 | title1 = The Mountain Wreath | length1 = 2:21 | title2 = Destiny | length2 = 8:45 | title3 = Saberstorm | length3 = 2:59 | title4 = Yaroslav's Rebellion | length4 = 5:09 | title5 = The Nightmare (Menu Theme) | length5 = 2:27 | title6 = Konrad the Traitor | length6 = 2:49 | title7 = Yuliya | length7 = 2:53 | title8 = Nemesis | length8 = 3:04 | title9 = Belisarius | length9 = 3:18 | title10 = Aberrant Knight | length10 = 3:02 | title11 = Nurgei | length11 = 3:15 | title12 = Wormlord | length12 = 3:53 | title13 = Wyvern's Lament | length13 = 3:52 | title14 = Doppelganger | length14 = 2:22 | title15 = Baryak | length15 = 2:02 }} == External links == * [https://open.spotify.com/album/1cORrZ4GAVDbMvbEbvEL4q Spotify] * [https://music.apple.com/ua/album/bleak-faith-original-soundtrack/1678680781 Apple Music] * [https://martelvladimiroff.bandcamp.com/album/bleak-faith-forsaken Bandcamp] d8060222851027ad9a4b2724ead306d2de16f292 Blade Dash 0 575 911 2025-07-15T20:18:43Z Sharparam 284703 Fix image wikitext text/x-wiki {{Infobox/Ability | image = OrientalDash.png | title = Blade Dash | Cost = 45 | Cooldown = 15 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} d8d63bcf9e2ab9e7610a637cbfae9e493d98a50d Whirlwind Strike 0 576 913 2025-07-15T20:20:57Z Sharparam 284703 Created page with "{{Infobox/Ability | image = OrientalSpin.png | title = Whirlwind Strike | Cost = 75 | Cooldown = 25 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}" wikitext text/x-wiki {{Infobox/Ability | image = OrientalSpin.png | title = Whirlwind Strike | Cost = 75 | Cooldown = 25 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} e6c1e11c6f18f8785af475d924c7d62d672fe3b3 Dual Wields 0 474 712 2025-07-15T20:31:49Z Sharparam 284703 Sharparam moved page [[Dual Wields]] to [[Dual Wield]]: Misspelled title: Called "Dual Wield" in-game wikitext text/x-wiki #REDIRECT [[Dual Wield]] f2856295451ab1cd2a686e19d6b0fbaa265f1d98 Template:Navbox/Equipment 10 437 634 2025-07-15T21:22:10Z Sharparam 284703 Add more equipment wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Equipment | title = [[Equipment]] | group1 = [[Weapons]] | list1 = {{Navbox/Weapons|child}} | group2 = [[Armor]] | list2 = {{Navbox/Armor|child}} | group3 = [[Amulets]] | list3 = {{Navbox/Amulets|child}} | group4 = [[Rings]] | list4 = {{Navbox/Rings|child}} | group5 = [[Capes]] | list5 = {{Navbox/Capes|child}} }} 4e9b09f139c8eefe809a3e0918f7584ff16eb363 Template:Navbox/Items 10 285 312 311 2025-07-15T21:44:42Z Sharparam 284703 Add some missing categories wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = Items | group1 = [[Anomalous crystals]] | list1 = {{Navbox/Anomalous crystals|child}} | group2 = [[Consumables]] | list2 = {{Navbox/Consumables|child}} | group3 = [[Equipment]] | list3 = {{Navbox/Equipment|child}} }} a411861b5bf4a6d8ba1b5a05f0287d3802aecd95 313 312 2025-07-15T22:49:03Z Sharparam 284703 Add link to items page wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Anomalous crystals]] | list1 = {{Navbox/Anomalous crystals|child}} | group2 = [[Consumables]] | list2 = {{Navbox/Consumables|child}} | group3 = [[Equipment]] | list3 = {{Navbox/Equipment|child}} }} ca3cdc023f216bb4caa76a9db8f95fb5602e929f 314 313 2025-07-16T02:49:01Z Sharparam 284703 Add crafting items section wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Anomalous crystals]] | list1 = {{Navbox/Anomalous crystals|child}} | group2 = [[Consumables]] | list2 = {{Navbox/Consumables|child}} | group3 = [[Equipment]] | list3 = {{Navbox/Equipment|child}} | group4 = [[Crafting]] | list4 = {{Navbox/Crafting items|child}} }} bf2478c6b03d574c41156fec247613edf994dde1 315 314 2025-07-16T02:56:59Z Sharparam 284703 Fix materials group wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Anomalous crystals]] | list1 = {{Navbox/Anomalous crystals|child}} | group2 = [[Consumables]] | list2 = {{Navbox/Consumables|child}} | group3 = [[Equipment]] | list3 = {{Navbox/Equipment|child}} | group4 = [[Materials]] | list4 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 57fc6de198843d9c4942092a4ee85caca6ff4037 316 315 2025-07-16T04:05:59Z Sharparam 284703 Add some essential items wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Mobius Blade]] * [[Old Key]] * [[Scanner]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 3a6eb5fa278020754af0321a425464a6b8536c19 Equipment 0 467 698 2025-07-15T22:48:30Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] that the player can wear. {{Navbox/Equipment}} c2de744eb63e9dbba3e8fff73404a00624386c66 Items 0 416 594 2025-07-15T22:49:50Z Sharparam 284703 Initial page wikitext text/x-wiki '''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects. {{Navbox/Items}} f9e1d38d5ce67ef854c74e6280c1d93d64ed929f Citadel Warrior Chest 0 481 726 2025-07-15T23:06:59Z Sharparam 284703 Add set name wikitext text/x-wiki {{Infobox/Armor | image = Citadel Warrior Chest.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Medium | Set = Citadel Warrior | Mk2_Sharp = 984 | Mk2_Blunt = 1296 | Mk2_Technomancy = 719 }} {{Navbox/Armor}} 2d3a3133daf3387abf5d098ec92e1514330b81d4 Category:Chestguards 14 471 706 2025-07-15T23:12:42Z Sharparam 284703 Initial page wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Template:Infobox/Armor set/doc 10 456 676 2025-07-15T23:32:11Z Sharparam 284703 Fix wrong template used in example wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for an armor set", "params": { "image": { "label": "Armor set image", "description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.", "required": true, "example": "Cool armor set.png", "type": "wiki-file-name" }, "Weight": { "label": "Armor set weight", "description": "The weight class of the armor set.", "required": true, "example": "Light", "type": "string" }, "Helmet": { "label": "Helmet piece", "description": "The armor used for the helmet slot.", "required": true, "example": "Cool Helmet", "type": "wiki-page-name" }, "Pauldrons": { "label": "Pauldrons piece", "description": "The armor used for the pauldrons slot.", "required": true, "example": "Cool Pauldrons", "type": "wiki-page-name" }, "Chestguard": { "label": "Chestguard piece", "description": "The armor used for the chestguard slot.", "required": true, "example": "Cool Chestguard", "type": "wiki-page-name" }, "Legguard": { "label": "Legguard piece", "description": "The armor used for the legguard slot.", "required": true, "example": "Cool Legguard", "type": "wiki-page-name" }, "Gauntlets": { "label": "Gauntlets piece", "description": "The armor used for the gauntlets slot.", "required": true, "example": "Cool Gauntlets", "type": "wiki-page-name" }, "Mk1_Sharp": { "label": "Mk 1 sharp rating", "description": "Total sharp defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Blunt": { "label": "Mk 1 blunt rating", "description": "Total blunt defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Technomancy": { "label": "Mk 1 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk2_Sharp": { "label": "Mk 2 sharp rating", "description": "Total sharp defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Blunt": { "label": "Mk 2 blunt rating", "description": "Total blunt defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Technomancy": { "label": "Mk 2 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk3_Sharp": { "label": "Mk 3 sharp rating", "description": "Total sharp defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Blunt": { "label": "Mk 3 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk3_Technomancy": { "label": "Mk 3 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk4_Sharp": { "label": "Mk 4 sharp rating", "description": "Total sharp defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Blunt": { "label": "Mk 4 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Technomancy": { "label": "Mk 4 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk5_Sharp": { "label": "Mk 5 sharp rating", "description": "Total sharp defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Blunt": { "label": "Mk 5 blunt rating", "description": "Total blunt defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Technomancy": { "label": "Mk 5 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} <syntaxhighlight lang="wikitext"> {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} </syntaxhighlight> 0b9b19ca76ed3cf82ad6c4644f7d39ea57f56907 Citadel Warrior 0 484 732 2025-07-15T23:34:49Z Sharparam 284703 Remove redundant category entry wikitext text/x-wiki {{Infobox/Armor set | image = Citadel Warrior.png | title = {{PAGENAME}} | Weight = Medium | Helmet = Citadel Warrior Helmet | Pauldrons = Citadel Warrior Shoulders | Chestguard = Citadel Warrior Chest | Legguard = Citadel Warrior Legguards | Gauntlets = Citadel Warrior Gauntlets }} '''{{PAGENAME}}''' is an [[armor set]] in {{BFF}}. == Pieces == * [[Citadel Warrior Helmet]] * [[Citadel Warrior Shoulders]] * [[Citadel Warrior Chest]] * [[Citadel Warrior Legguards]] * [[Citadel Warrior Gauntlets]] == See also == * [[Citadel Defender]] &ndash; Heavy variant with higher defense ratings. {{Navbox/Armor}} e1f48b76a2706b1879b8a99de8adffee44fc8785 Dual wield 0 473 710 2025-07-16T01:35:42Z Sharparam 284703 Initial page wikitext text/x-wiki #REDIRECT [[Dual Wield]] f2856295451ab1cd2a686e19d6b0fbaa265f1d98 Perk 0 746 1152 2025-07-16T01:36:24Z Sharparam 284703 Initial page wikitext text/x-wiki #REDIRECT [[Perks]] 22eac196aff02ba31a4bced80e80fcfdc8051202 Perks 0 747 1154 2025-07-16T01:37:30Z Sharparam 284703 Initial page wikitext text/x-wiki '''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time. {{Navbox/Perks}} 26af41c73ec1c4e20599336d60d88a8378c8c6ab Dual Wield Mastery 0 743 1146 2025-07-16T01:41:58Z Sharparam 284703 Add navbox wikitext text/x-wiki [[File:Dual_Wield_Mastery.png|thumb]] '''{{PAGENAME}}''' is a [[perk]] in {{BFF}}. It improves proficiency with [[dual wield]] [[weapons]]. == Effect == Offhand weapons now deal 60% of their damage instead of 35%. == Upgrades == * Critical Chance increases by 1% with each combo point while dual wielding. * While dual wielding, you do not consume any stamina for melee attacks if at 15 or above combo points. {{Navbox/Perks}} [[Category:Perks]] 78e20c9ebd95bf46994bc694995631a11d79d8b6 Dual Wield 0 472 708 2025-07-16T02:01:29Z Sharparam 284703 Add link to weapons page wikitext text/x-wiki {{Stub}} '''{{PAGENAME}}''' is a [[Weapons|weapon]] type in {{BFF}}. == List of Dual Wields == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |where=type='Dual Wield' |format=table }} [[Category:Dual Wields]] 6c2224d2e50f2da2b16a52ca04227ca57d27bbc8 Template:Navbox/Consumables 10 286 324 2025-07-16T02:08:19Z Sharparam 284703 Initial page wikitext text/x-wiki {{Navbox | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Greater Restorative Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Restorative Fluid]] }} 068b364b9f72ace337b6eda9b1fad98cea7c7265 325 324 2025-07-16T02:10:01Z Sharparam 284703 wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Greater Restorative Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Restorative Fluid]] }} 6b145de4128c95947cf01cfb2105da562d651fcc 326 325 2025-07-16T03:01:52Z Sharparam 284703 Add missing consumables wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | group1 = Fluids | list1 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Restorative Fluid]] | group2 = Concoctions | list2 = * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] }} ce72b9ce75fe8de2da765ca2df5313636d5374d5 327 326 2025-07-16T03:03:30Z Sharparam 284703 Add missing consumables wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] | group2 = Fluids | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Restorative Fluid]] | group3 = Concoctions | list3 = * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Experience Concoction]] * [[Mystery Concoction]] }} f6d2786b1121af8c872d30d7b61e7d07d561e8cf 328 327 2025-07-16T03:03:55Z Sharparam 284703 Add template category wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] | group2 = Fluids | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Restorative Fluid]] | group3 = Concoctions | list3 = * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Experience Concoction]] * [[Mystery Concoction]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 29b982f060212718a4387efef495e9ad1b455ba9 329 328 2025-07-16T03:07:10Z Sharparam 284703 Add more missing consumables wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] | group2 = Fluids | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Regenerative Fluid]] * [[Restorative Fluid]] | group3 = Concoctions | list3 = * [[Diver's Lungs Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Mighty Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Concoction: Zealot's Tears]] * [[Experience Concoction]] * [[Mystery Concoction]] }}<noinclude>[[Category:Navigation templates]]</noinclude> e9736a1ea6833ecda5952ac6a85bce948c9cf19a Consumables 0 428 618 2025-07-16T02:10:59Z Sharparam 284703 Initial page wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[Items|item]] that the player can use to heal themselves, restore resources, or gain various buffs. {{Navbox/Consumables}} d9a89e867297dd4ee6e2667cdb541b327cdc74e4 NPC 0 367 496 2025-07-16T02:34:31Z Sharparam 284703 Redirected page to [[NPCs]] wikitext text/x-wiki #REDIRECT [[NPCs]] 0c78678b45694b9a9f67883eca2a30eaa6ea5607 Materials 0 431 624 2025-07-16T02:55:24Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. {{Navbox/Materials}}" wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. {{Navbox/Materials}} 16c02de5636f61c53bd16cf7e1d04625cb9646e2 Template:Infobox/Cape/doc 10 463 690 2025-07-16T03:13:35Z Sharparam 284703 Created page with "== Examples == {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} <syntaxhighlight lang="wikitext"> {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} </syntaxhighlight>" wikitext text/x-wiki == Examples == {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} <syntaxhighlight lang="wikitext"> {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} </syntaxhighlight> 90d89e60cc634d47fd7681de76278937e16255fc Template:Navbox/Capes 10 287 331 2025-07-16T03:15:32Z Sharparam 284703 Created page with "{{Navbox | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude>" wikitext text/x-wiki {{Navbox | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 0d84fc50e23693f75a69a43dd191d9913b09c6bd 332 331 2025-07-16T03:15:49Z Sharparam 284703 Add missing param passthrough wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> b29e7b93ce7ebeee0420b0126beba25917db3c9f Wanderer Cape 0 512 787 2025-07-16T03:18:07Z Sharparam 284703 Created page with "{{Infobox/Cape | title = {{PAGENAME}} | image = Wanderer Cape.png | Effect1 = -0.5 second delay before stamina starts to regenerate. }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Infobox/Cape | title = {{PAGENAME}} | image = Wanderer Cape.png | Effect1 = -0.5 second delay before stamina starts to regenerate. }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}. {{Navbox/Capes}} 1f5137f1dafe59cd4ffe5c3b254751901918d15e Capes 0 443 651 2025-07-16T03:19:24Z Sharparam 284703 Fix grammar wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] the player can wear to gain various bonus stats or effects. {{Navbox/Capes}} e68b383acdf3f302a6ce54944a3b34f545506c55 Template:Infobox/Ability 10 459 682 2025-07-16T03:20:32Z Sharparam 284703 Add template category wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=ability |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info,Description |Basic Info=Cost,Cooldown |Cost_label=Flux cost |Cooldown={{#if:{{{Cooldown|}}}|{{{Cooldown}}}&nbsp;seconds}} |Description_nolabel=yes |Description_isdata=yes }}{{#if:{{NAMESPACE}}||[[Category:Abilities]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> c1ad1894018a724cf6235cea17b860aa85344fed Template:Infobox/Armor set 10 455 674 2025-07-16T03:21:07Z Sharparam 284703 Add template category wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor-set |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Pieces, Stats |Basic Info=Weight |Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets |Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}} |Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}} |Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}} |Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}} |Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}} |tabs= Mk1, Mk2, Mk3, Mk4, Mk5 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude> {{Documentation}}[[Category:Infobox templates]]</noinclude> d0b44e9f72dec247f40dfa79c3541b37ed9c3937 Template:Infobox/Cape 10 462 688 2025-07-16T03:21:20Z Sharparam 284703 Add template category wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=cape |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Effects |Effects=Effect1,Effect2,Effect3 |Effect1_nolabel=yes |Effect2_nolabel=yes |Effect3_nolabel=yes }}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 1957e3d416bf10a10bad93e51f649ad4f1768848 Template:Navbox/Anomalous crystals 10 288 337 2025-07-16T03:24:08Z Sharparam 284703 Created page with "{{Navbox | template = Navbox/Anomalous crystals | title = [[Anomalous crystals]] | list1= * [[Lesser Anomalous Crystal]] * [[Anomalous Crystal]] * [[Greater Anomalous Crystal]] }}<noinclude>[[Category:Navigation templates]]</noinclude>" wikitext text/x-wiki {{Navbox | template = Navbox/Anomalous crystals | title = [[Anomalous crystals]] | list1= * [[Lesser Anomalous Crystal]] * [[Anomalous Crystal]] * [[Greater Anomalous Crystal]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 6702c38b572ae6caefc04acd4b08e219bf9a5d68 338 337 2025-07-16T03:24:22Z Sharparam 284703 Add missing param passthrough wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Anomalous crystals | title = [[Anomalous crystals]] | list1= * [[Lesser Anomalous Crystal]] * [[Anomalous Crystal]] * [[Greater Anomalous Crystal]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ebedb2789af69363588ddf5553b8868dcbf7005d Lore 0 371 504 2025-07-16T03:47:22Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}. == Data logs == {{Main|Data logs}} == Documents == {{Main|Documents}} {{Navbox/Lore}} [[Category:Lore]]" wikitext text/x-wiki '''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}. == Data logs == {{Main|Data logs}} == Documents == {{Main|Documents}} {{Navbox/Lore}} [[Category:Lore]] 3efab73936854b174032435bb0c6f8b77736139d Template:Navbox/Lore 10 289 340 2025-07-16T03:50:26Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * The..." wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] | group2 = [[Documents]] | list2 = }}<noinclude>[[Category:Navigation templates]]</noinclude> 1db288cb2f5c6f51241b5be78a1ec242687b398b 341 340 2025-07-16T03:51:13Z Sharparam 284703 Add documents wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] | group2 = [[Documents]] | list2 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 753896515d0e262801ebc6f6c76b02000f959d56 342 341 2025-07-16T03:51:45Z Sharparam 284703 Move data logs to own navbox wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = {{Navbox/Data logs|child}} | group2 = [[Documents]] | list2 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 35a5da538ee72dc5a83dbbb27fd8f38e54f93c7c 343 342 2025-07-16T03:53:21Z Sharparam 284703 Move documents to own navbox wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = {{Navbox/Data logs|child}} | group2 = [[Documents]] | list2 = {{Navbox/Documents|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> cc386cacfb50aa464ec9e6065463991e75c6ef65 Template:Navbox/Data logs 10 290 345 2025-07-16T03:52:43Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<..." wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> a835cd772b8a5f1437f310d8490931607791fc25 Template:Navbox/Documents 10 291 368 2025-07-16T03:53:56Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Documents | title = [[Documents]] | list1 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Documents | title = [[Documents]] | list1 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 4859742a1634980b598ee96ab98cf1b44828e159 Monastery Impression 0 370 502 2025-07-16T03:56:10Z Sharparam 284703 Fix casing wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote | Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence &ndash; here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 5d6199c92d0ebf1baedb5890d3776274eadefaef Documents 0 373 508 2025-07-16T03:58:18Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Documents are typically found as drops from [[enemies]]. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]]" wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Documents are typically found as drops from [[enemies]]. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 3305c6ccf580021e8513f612ab7919e6863f1f47 Data logs 0 372 506 2025-07-16T03:59:46Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Data logs are uncovered by interacting at certain specific points in the game world. To locate these points, use of the [[Scanner]] is recommended. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 0b268f9f4958f98eba1f00ec6c06edbba3c10826 Template:Infobox/Item/doc 10 464 692 2025-07-16T04:02:44Z Sharparam 284703 Created page with "== Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} </syntaxhighlight>" wikitext text/x-wiki == Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} </syntaxhighlight> 9a956a5275f4ed54d4ffea9d646a5229cadc93a6 Template:Reflist/styles.css 10 616 969 2025-07-16T05:41:40Z Sharparam 284703 Copied from [[mediawiki:Template:Reflist/styles.css]] sanitized-css text/css .reflist { list-style-type: decimal; margin-bottom: 0.5em; } @media screen { .reflist { font-size: 0.9em; /* Make default font smaller only on screens. */ } } .reflist .references { font-size: 1em; /* Reset font size when nested in reflist. */ list-style-type: inherit; /* Enable custom list-style types. */ margin-bottom: 0; /* Avoid double margin when nested in reflist. */ } .reflist-columns { margin-top: 0.3em; /* Reset top margin for column-embedded lists. */ } .reflist-columns ol { margin-top: 0; } .reflist-columns li { break-inside: avoid-column; /* Avoid elements breaking between columns. */ } .reflist-upper-alpha { list-style-type: upper-alpha; } .reflist-upper-roman { list-style-type: upper-roman; } .reflist-lower-alpha { list-style-type: lower-alpha; } .reflist-lower-greek { list-style-type: lower-greek; } .reflist-lower-roman { list-style-type: lower-roman; } e2f766e5d4d3ee66aca32f6714fef1bc97648e0a Template:Notelist 10 612 961 2025-07-16T05:42:49Z Sharparam 284703 Copied from [[mediawiki:Template:Notelist]] wikitext text/x-wiki {{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude> {{Documentation}}</noinclude> 94f17b894235ff18c73072096f5940cdbcc5b719 Template:Note 10 615 967 2025-07-16T05:49:15Z Sharparam 284703 Copied from [[mediawiki:Template:Efn]] wikitext text/x-wiki <includeonly>{{#if:{{{name|}}} |{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|name={{{name|}}}|group={{#switch: {{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }} }} |{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|group={{#switch: {{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }} }} }}</includeonly><noinclude> {{documentation}} </noinclude> 6ed4e5c148014b92a23bd51d16f3180881bb876c Template:Ref 10 617 971 2025-07-16T05:52:58Z Sharparam 284703 Copied from [[wikipedia:Template:Refn]] wikitext text/x-wiki <includeonly>{{#if:{{{follow|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}|follow={{{follow|}}}}}|{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 9fd4ba12eab57eadfed1197d60df81947547d276 MediaWiki:Cite link label group-lower-alpha 8 618 973 2025-07-16T05:56:10Z Sharparam 284703 Copied from [[wikipedia:MediaWiki:Cite link label group-lower-alpha]] wikitext text/x-wiki a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz aaa aab aac aad aae aaf aag aah aai aaj aak aal aam aan aao aap aaq aar aas aat aau aav aaw aax aay aaz aba abb abc abd abe abf abg abh abi abj abk abl abm abn abo abp abq abr abs abt abu abv abw abx aby abz aca acb acc acd ace acf acg ach aci acj ack acl acm acn aco acp acq acr acs act acu acv acw acx acy acz ada adb adc add ade adf adg adh adi adj adk adl adm adn ado adp adq adr ads adt adu adv adw adx ady adz aea aeb aec aed aee aef aeg aeh aei aej aek ael aem aen aeo aep aeq aer aes aet aeu aev aew aex aey aez afa afb afc afd afe aff afg afh afi afj afk afl afm afn afo afp afq afr afs aft afu afv afw afx afy afz aga agb agc agd age agf agg agh agi agj agk agl agm agn ago agp agq agr ags agt agu agv agw agx agy agz aha ahb ahc ahd ahe ahf ahg ahh ahi ahj ahk ahl ahm ahn aho ahp ahq ahr ahs aht ahu ahv ahw ahx ahy ahz aia aib aic aid aie aif aig aih aii aij aik ail aim ain aio aip aiq air ais ait aiu aiv aiw aix aiy aiz aja ajb ajc ajd aje ajf ajg ajh aji ajj ajk ajl ajm ajn ajo ajp ajq ajr ajs ajt aju ajv ajw ajx ajy ajz aka akb akc akd ake akf akg akh aki akj akk akl akm akn ako akp akq akr aks akt aku akv akw akx aky akz ala alb alc ald ale alf alg alh ali alj alk all alm aln alo alp alq alr als alt alu alv alw alx aly alz ama amb amc amd ame amf amg amh ami amj amk aml amm amn amo amp amq amr ams amt amu amv amw amx amy amz ana anb anc and ane anf ang anh ani anj ank anl anm ann ano anp anq anr ans ant anu anv anw anx any anz aoa aob aoc aod aoe aof aog aoh aoi aoj aok aol aom aon aoo aop aoq aor aos aot aou aov aow aox aoy aoz apa apb apc apd ape apf apg aph api apj apk apl apm apn apo app apq apr aps apt apu apv apw apx apy apz aqa aqb aqc aqd aqe aqf aqg aqh aqi aqj aqk aql aqm aqn aqo aqp aqq aqr aqs aqt aqu aqv aqw aqx aqy aqz ara arb arc ard are arf arg arh ari arj ark arl arm arn aro arp arq arr ars art aru arv arw arx ary arz asa asb asc asd ase asf asg ash asi asj ask asl asm asn aso asp asq asr ass ast asu asv asw asx asy asz ata atb atc atd ate atf atg ath ati atj atk atl atm atn ato atp atq atr ats att atu atv atw atx aty atz aua aub auc aud aue auf aug auh aui auj auk aul aum aun auo aup auq aur aus aut auu auv auw aux auy auz ava avb avc avd ave avf avg avh avi avj avk avl avm avn avo avp avq avr avs avt avu avv avw avx avy avz awa awb awc awd awe awf awg awh awi awj awk awl awm awn awo awp awq awr aws awt awu awv aww awx awy awz axa axb axc axd axe axf axg axh axi axj axk axl axm axn axo axp axq axr axs axt axu axv axw axx axy axz aya ayb ayc ayd aye ayf ayg ayh ayi ayj ayk ayl aym ayn ayo ayp ayq ayr ays ayt ayu ayv ayw ayx ayy ayz aza azb azc azd aze azf azg azh azi azj azk azl azm azn azo azp azq azr azs azt azu azv azw azx azy azz b49c822b47338613f0c10a02bd4f6a2a6735e324 Untitled Log 0 369 500 2025-07-16T05:56:29Z Sharparam 284703 Use note templates wikitext text/x-wiki '''{{PAGENAME}}''' is a [[lore]] [[Documents|document]] that can be found in {{BFF}}. == Overview == There are multiple untitled logs in the game, each with their own text. {{Quote |I remember waking in a pile of lifeless bodies. Not only lifeless though. Expressionless. Frozen visages. }} {{Quote | Like waking from a dream about dreaming, everything is a haze. A dark ominous haze. I've seen death, pain, and torture. I hear a voice. Once in a while I see the voice beckon, like a ripple in water &ndash; before I can make form of the image. I am gone too. }} {{Quote | I have no mouth, and I know nobody would hear me scream.{{note|Likely a reference to [[wikipedia:I Have No Mouth, and I Must Scream|I Have No Mouth, and I Must Scream]].}} }} {{Quote | No matter where my mind wanders, there is an oppressive red mist crushing the reaches of my imagination. Try as I might, there seems to be no escape. No escape. Only a journey deeper. Farther.. but what awaits at the innermost depths. I suppose the [[Omnistructure]] makes room beyond sense.. beyond time. }} == Notes == {{notelist}} {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 472bf3de6dbca52f57c3f288b12ad3650a51f3b6 Template:Reflist 10 613 963 2025-07-16T08:32:37Z Sharparam 284703 Protected "[[Template:Reflist]]": Stable template ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) wikitext text/x-wiki <templatestyles src="Reflist/styles.css" /><div class="reflist<!-- -->{{#if:{{{1|}}}{{{colwidth|}}}|&#32;reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}} | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = reflist-{{{liststyle|{{{group}}}}}} }}" <!-- End class, start style -->{{#if:{{{1|}}} | {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}} | {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}} }}> {{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude> {{Documentation}}</noinclude> 5865246773ff390ed5700866ea2396d78a81b01f Template:Navbox/Capes 10 287 333 332 2025-07-16T18:35:43Z Sharparam 284703 Add [[Folk Cape]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Folk Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> d08fd75315ebac94e72678f90276c13a3506783a 334 333 2025-07-21T02:15:24Z Sharparam 284703 Add [[Corrupted Cape]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Corrupted Cape]] * [[Folk Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 9f0729072622507472ffd1be806417db23ffe410 335 334 2025-07-21T04:04:55Z Sharparam 284703 Add [[Techpriest Cape]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Corrupted Cape]] * [[Folk Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Techpriest Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 25d3fe6cdc6b4cce6fe483d3b4b7218599b53b34 Dust Sea 0 375 512 2025-07-16T18:55:34Z Sharparam 284703 Created page with "The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are th..." wikitext text/x-wiki The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are the carcasses of long-forgotten machinery and the ruins of old structures. The architecture of these relics hints at a bygone era, a dark age marked by more primitive technology. This eerie landscape tells a silent tale of a past civilization, now buried beneath the relentless sands of time. }} == Location == {{coords|-4062|-2272|5797}} Can be found at the top of a broken down tower in [[Deluge|the Deluge]] area, just past the [[Folk Cape]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left. Continue forward until reaching the big tower, climb it to the top and you will find the data log at the edge of the tower (use [[Scanner|the Scanner]] to see it more easily). {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 90fdcaf4874fbb945c79bf4bf3df130f8ba25db5 Template:Navbox/Data logs 10 290 346 345 2025-07-16T18:55:55Z Sharparam 284703 Add [[Dust Sea]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 214a4da82294ef39e752b290dbf6e8bbe5cab06f 347 346 2025-07-16T20:02:58Z Sharparam 284703 Add [[Psychosis]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 2365608ea721de33b646b2deff88698eeb4f9b89 348 347 2025-07-21T04:12:14Z Sharparam 284703 Add [[Night Horror]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ab06e89cfbb84fd1c6a88bd34ce62082702c1f11 349 348 2025-07-21T05:37:47Z Sharparam 284703 Add [[The Banshee]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 8d4aa14493f7ae826b561ab952726806ac2be395 Folk Cape 0 513 789 2025-07-16T18:58:28Z Sharparam 284703 Improve location description wikitext text/x-wiki {{Infobox/Cape | image = Folk Cape.png | title = {{PAGENAME}} | Effect1 = -20% Technocasting speed | Effect2 = +10% [[Technomancy]] penetration | Effect3 = +50 Max [[flux]] points }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn by the player to gain certain effects. == Location == {{coords|-3979|-2143|5796}} At the top of a broken down tower in [[Deluge|the Deluge]] area, in front of [[Dust Sea|the Dust Sea]] [[Data logs|data log]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left, then continue until you enter the big tower. Climb the tower to the top and you'll find the item on the ground at the top of the last set of stairs. {{Navbox/Capes}} ced1f8221d9ad9bf30775a81e257aa3efb4d12dd Crude Helmet 0 489 742 2025-07-16T19:06:23Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Crude Helmet.png | title = {{PAGENAME}} | Type = Helmet | Weight = Medium | Mk2_Sharp = 516 | Mk2_Blunt = 600 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}. == Location == {{coords|-3538|-6027|5477}} Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and fo..." wikitext text/x-wiki {{Infobox/Armor | image = Crude Helmet.png | title = {{PAGENAME}} | Type = Helmet | Weight = Medium | Mk2_Sharp = 516 | Mk2_Blunt = 600 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}. == Location == {{coords|-3538|-6027|5477}} Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item. {{Navbox/Armor}} 4327414a895ebc5fd2ac98909457618e6423b0f3 Template:Navbox/Rings 10 292 370 2025-07-16T19:11:48Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] }}<noinclude>[[Category:Navigation templates]]</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 7e4970f06f67401009bd01cbb3fb3b4f7a0a3720 Rings 0 442 649 2025-07-16T19:12:25Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects. {{Navbox/Rings}} [[Category:Rings]]" wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects. {{Navbox/Rings}} [[Category:Rings]] 7adf2438732889de3ab3158748516564e3c337cb Ring of Burning Desire 0 519 801 2025-07-16T19:13:11Z Sharparam 284703 remove "the" from "the Diver" wikitext text/x-wiki {{Infobox/Ring | image = Ring of Burning Desire.png | title = {{PAGENAME}} | Effect1 = +20% chance to inflict [[heat]] [[status effect]]. }} '''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}. == Acquisition == Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area. {{Navbox/Rings}} e25c13f86a914c3c38145e3c207d7ca4d045bcf0 Gingko Leaves 0 433 628 2025-07-16T19:23:24Z Sharparam 284703 Add note on acquisition wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]]. == Acquisition == Drops from several enemies in the game, as well as found on the ground in certain locations. == Locations == {| class="wikitable" ! Amount !! Area !! Description !! Coordinates |- | 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}} |} {{Navbox/Materials}} [[Category:Materials]] 0fbff16a09a73af85c8ed1146f701144d7062005 Template:Weapons/CargoDeclare 10 448 660 2025-07-16T19:36:02Z Sharparam 284703 Add support for Mk 0 wikitext text/x-wiki {{#cargo_declare:_table=Weapons |name=String |type=String |speed=String |damageType=String |damageMk0Min=Integer |damageMk0Max=Integer |damageMk1Min=Integer |damageMk1Max=Integer |damageMk2Min=Integer |damageMk2Max=Integer |damageMk3Min=Integer |damageMk3Max=Integer |damageMk4Min=Integer |damageMk4Max=Integer |damageMk5Min=Integer |damageMk5Max=Integer }} 058226c206cdffeac8dd6c20fbd40d7a4b81f948 Template:Weapons/CargoStore 10 449 662 2025-07-16T19:36:27Z Sharparam 284703 Add support for Mk 0 wikitext text/x-wiki <includeonly>{{#cargo_store:_table=Weapons |name={{{name|}}} |type={{{type|}}} |speed={{{speed|}}} |damageType={{{damageType|}}} |damageMk0Min={{{damageMk0Min|}}} |damageMk0Max={{{damageMk0Max|}}} |damageMk1Min={{{damageMk1Min|}}} |damageMk1Max={{{damageMk1Max|}}} |damageMk2Min={{{damageMk2Min|}}} |damageMk2Max={{{damageMk2Max|}}} |damageMk3Min={{{damageMk3Min|}}} |damageMk3Max={{{damageMk3Max|}}} |damageMk4Min={{{damageMk4Min|}}} |damageMk4Max={{{damageMk4Max|}}} |damageMk5Min={{{damageMk5Min|}}} |damageMk5Max={{{damageMk5Max|}}} }}</includeonly><noinclude>{{#cargo_attach:table=Weapons}}</noinclude> f0f50597b71007312dd924dfdbdaec0c577db10f Divine Blessing 0 577 915 2025-07-16T19:42:01Z Sharparam 284703 Created page with "{{Infobox/Ability | image = Divine Blessing.png | title = {{PAGENAME}} | Cost = 125 | Cooldown = 30 | Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]]. }} '''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}" wikitext text/x-wiki {{Infobox/Ability | image = Divine Blessing.png | title = {{PAGENAME}} | Cost = 125 | Cooldown = 30 | Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]]. }} '''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} 552de679ebb2751ab76780e73c8c534074b51109 Template:Navbox/Items 10 285 317 316 2025-07-16T19:44:12Z Sharparam 284703 Add [[Ability Splinter]] wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Ability Splinter]] * [[Mobius Blade]] * [[Old Key]] * [[Scanner]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 2673f0c1725f34950c7425ee96a8c3a415a40efc 318 317 2025-07-21T04:25:24Z Sharparam 284703 Add [[Handler Echo]] wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Mobius Blade]] * [[Old Key]] * [[Scanner]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 0448d19159189da48bb14a046071effd62b3ef4d Category:Essential items 14 418 598 2025-07-16T19:47:01Z Sharparam 284703 Created page with "[[Category:Items]]" wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Category:Upgrade items 14 419 600 2025-07-16T19:56:59Z Sharparam 284703 Created page with "[[Category:Items]]" wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Psychosis 0 376 514 2025-07-16T20:02:38Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu… }..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu… }} == Location == {{coords|-5130|-1039|5616}} Found in [[Deluge|the Deluge]] area, near one of the [[Upgrade Splinter|upgrade splinters]] in the first big rectangular structure with pillars, near the first red lightpole. Use [[Scanner|the Scanner]] to more easily find the data log. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] b4998452a6a35bf04aeb60ea5d8c95c3edf9e497 Anomalous crystals 0 427 616 2025-07-16T20:18:17Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties. == Overview == There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''. Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, cau..." wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties. == Overview == There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''. Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever. {{Navbox/Items}} [[Category:Anomalous crystals]] 5cef9dfbb687f0e77132dcb7450a11e973b25b95 Scanner 0 374 510 2025-07-16T20:22:09Z Sharparam 284703 Add more info wikitext text/x-wiki {{Infobox/Item | image = Scanner.png | title = {{PAGENAME}} | Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena. }} The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders. {{Navbox/Items}} [[Category:Essential items]] [[Category:Lore]] 72e26e842e217333080947ca9fd96dff00b2be1e One-handed weapons 0 496 756 2025-07-16T20:32:03Z Sharparam 284703 Add weapon list wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[Weapons|weapon]] in {{BFF}} that come in two variants: [[sharp]] and [[blunt]]. == List of one-handed weapons == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |where=type='one-handed' |format=table }} {{Navbox/Weapons}} [[Category:One-handed weapons]] db05c537c888c3ecd32676dae4cbd9e3b79033c3 Weapons 0 465 694 2025-07-16T20:33:26Z Sharparam 284703 Add Mk 0 damage column wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]]. == Upgrading == Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials. Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded. == List of weapons == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |format=table }} {{Navbox/Weapons}} 627eeadeab2f527ee330ed3f5b806dcef85b45e8 Template:Infobox/Shield/doc 10 458 680 2025-07-21T00:03:40Z Sharparam 284703 Created page with "== Examples == {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} <synt..." wikitext text/x-wiki == Examples == {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} </syntaxhighlight> f660f4831abeb203edfc85fcc8225afbe28becd3 Wooden Shield 0 754 1168 2025-07-21T00:05:33Z Sharparam 284703 Add details wikitext text/x-wiki {{Infobox/Shield | image = Wooden Shield.png | title = {{PAGENAME}} | Weight = Light | Mk0_Sharp = 52.8 | Mk0_Blunt = 46.8 | Mk0_Technomancy = 7.2 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}} a25cde7cfde39f917e98c499b4c23d236886a94f Template:Infobox/Shield 10 457 678 2025-07-21T00:10:28Z Sharparam 284703 Add placeholders for Mk values wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=shield |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Weight,Passives,Abilities |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}} |Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}} |Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}} |Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}} |Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}} |Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}} |Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}} |Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}} |Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}} |Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}} |Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}} |Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}} |Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}} |Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}} |Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}} |Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}} |Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}} |Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}} }}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 879802ba38814822053b519e3543784bf8a6ee64 Shields 0 445 655 2025-07-21T01:31:34Z Sharparam 284703 Add brief description wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] that can be used to protect the player against incoming [[damage]]. {{Navbox/Shields}} [[Category:Shields]] 1e7147da72fc96843c2350072a5e579292f4c0ac Fisherman 0 541 842 2025-07-21T01:43:20Z Sharparam 284703 Add drop wikitext text/x-wiki The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location. == Drops == * [[Diver's Lungs Concoction]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Lesser Anomalous Crystal]] * [[Lesser Restorative Fluid]] * [[Ring of Burning Desire]] * [[Sludge]] * [[Upgrade Splinter]] [[Category:Enemies]] 854a2903c300d816cf3a65b85c7bee9c7c9aeb6e Librarian Overcoat 0 482 728 2025-07-21T01:55:58Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Librarian Overcoat.png | title = {{PAGENAME}} | Type = Chestguard | Set = Librarian | Weight = Light | Mk1_Sharp = 660 | Mk1_Blunt = 744 | Mk1_Technomancy = 1009 }} == Location == Dropped by "Librarian" enemies in [[Deluge|the Deluge]]? {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | image = Librarian Overcoat.png | title = {{PAGENAME}} | Type = Chestguard | Set = Librarian | Weight = Light | Mk1_Sharp = 660 | Mk1_Blunt = 744 | Mk1_Technomancy = 1009 }} == Location == Dropped by "Librarian" enemies in [[Deluge|the Deluge]]? {{Navbox/Armor}} ae4dc71e0b3fd31a0a4477632675eea80c6965d8 Librarian Trousers 0 488 740 2025-07-21T02:10:16Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Librarian Trousers.png | title = {{PAGENAME}} | Type = Legguard | Weight = Light | Set = Librarian | Mk1_Sharp = 456 | Mk1_Blunt = 516 | Mk1_Technomancy = 696 }} {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | image = Librarian Trousers.png | title = {{PAGENAME}} | Type = Legguard | Weight = Light | Set = Librarian | Mk1_Sharp = 456 | Mk1_Blunt = 516 | Mk1_Technomancy = 696 }} {{Navbox/Armor}} 1d0c2fa9e238497ee92524a75f41846d76113cd8 Improved Diver's Lungs Concoction 0 744 1148 2025-07-21T02:20:25Z Sharparam 284703 Created page with "== Recipe == Obtained by defeating the many-legged creature in [[Deluge]]." wikitext text/x-wiki == Recipe == Obtained by defeating the many-legged creature in [[Deluge]]. a1b23855f2d6d50d291ff7ec5da567ce7c83641d Corrupted Cape 0 514 791 2025-07-21T02:27:42Z Sharparam 284703 wikitext text/x-wiki {{Infobox/Cape | image = Corrupted Cape.png | title = {{PAGENAME}} | Effect1 = +800 [[Sharp]] armor rating. | Effect2 = +800 [[Blunt]] armor rating. | Effect3 = +800 [[Technomancy]] armor rating. }} == Location == Dropped by the bigger knight guys ("Corrupted"?) wearing halberts in [[Deluge]]. {{Navbox/Capes}} 85092d24492b81865456f0c2ec6b4b43f2e6c927 Corrupted Cuirass 0 483 730 2025-07-21T02:28:57Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Corrupted Cuirass.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Heavy | Mk2_Sharp = 1728 | Mk2_Blunt = 1488 | Mk2_Technomancy = 174 }} {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | image = Corrupted Cuirass.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Heavy | Mk2_Sharp = 1728 | Mk2_Blunt = 1488 | Mk2_Technomancy = 174 }} {{Navbox/Armor}} 183dddf62f3fe9d1345ac172c6970d381d73782b Template:Armor/CargoDeclare 10 447 658 2025-07-21T02:30:31Z Sharparam 284703 Add Mk 0 wikitext text/x-wiki {{#cargo_declare:_table=Armor |name=String |setname=String |type=String |weight=String |sharpMk0=Integer |bluntMk0=Integer |technomancyMk0=Integer |sharpMk1=Integer |bluntMk1=Integer |technomancyMk1=Integer |sharpMk2=Integer |bluntMk2=Integer |technomancyMk2=Integer |sharpMk3=Integer |bluntMk3=Integer |technomancyMk3=Integer |sharpMk4=Integer |bluntMk4=Integer |technomancyMk4=Integer |sharpMk5=Integer |bluntMk5=Integer |technomancyMk5=Integer }} 338fa661fc066d90571ae8a2a2f747cb2c0d8f4f Template:Armor/CargoStore 10 450 664 2025-07-21T02:31:15Z Sharparam 284703 Add Mk 0 wikitext text/x-wiki <includeonly>{{#cargo_store:_table=Armor |name={{{name|}}} |setname={{{setname|}}} |type={{{type|}}} |weight={{{weight|}}} |sharpMk0={{{sharpMk0|}}} |bluntMk0={{{bluntMk0|}}} |technomancyMk0={{{technomancyMk0|}}} |sharpMk1={{{sharpMk1|}}} |bluntMk1={{{bluntMk1|}}} |technomancyMk1={{{technomancyMk1|}}} |sharpMk2={{{sharpMk2|}}} |bluntMk2={{{bluntMk2|}}} |technomancyMk2={{{technomancyMk2|}}} |sharpMk3={{{sharpMk3|}}} |bluntMk3={{{bluntMk3|}}} |technomancyMk3={{{technomancyMk3|}}} |sharpMk4={{{sharpMk4|}}} |bluntMk4={{{bluntMk4|}}} |technomancyMk4={{{technomancyMk4|}}} |sharpMk5={{{sharpMk5|}}} |bluntMk5={{{bluntMk5|}}} |technomancyMk5={{{technomancyMk5|}}} }}</includeonly><noinclude>{{#cargo_attach:table=Armor}}</noinclude> 333780ac478dc35967062b394838e177b662daa9 Ring of Serpent 0 748 1156 2025-07-21T03:12:56Z Sharparam 284703 Created page with "{{Infobox/Ring | image = Ring of Serpent.png | title = {{PAGENAME}} | Passives = [[Swift Reflexes]] | Effect1 = +2 [[Agility]] }} == Location == Near one of the underwater red lights in [[Deluge]]. {{Navbox/Rings}}" wikitext text/x-wiki {{Infobox/Ring | image = Ring of Serpent.png | title = {{PAGENAME}} | Passives = [[Swift Reflexes]] | Effect1 = +2 [[Agility]] }} == Location == Near one of the underwater red lights in [[Deluge]]. {{Navbox/Rings}} 66cfb985c30744dba393ecfef89461918d2773f8 Techpriest Cape 0 515 793 2025-07-21T04:01:06Z Sharparam 284703 Created page with "{{Infobox/Cape | image = Techpriest Cape | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will b..." wikitext text/x-wiki {{Infobox/Cape | image = Techpriest Cape | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left. == Trivia == * "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]]. {{Navbox/Capes}} a7524062d33903459d69f5c7ae482dff8f0536c9 Tall Military Shield 0 751 1162 2025-07-21T04:07:58Z Sharparam 284703 Created page with "{{Infobox/Shield | image = Tall Military Shield.png | title = {{PAGENAME}} | Weight = Heavy | Abilities = [[Improvised Fortification]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 66.5 | Mk2_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]]. == Location == {{coords|-4043|1327|1056}} Found in [[Asylum]]. After climbing a set of stars inside the first building after..." wikitext text/x-wiki {{Infobox/Shield | image = Tall Military Shield.png | title = {{PAGENAME}} | Weight = Heavy | Abilities = [[Improvised Fortification]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 66.5 | Mk2_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]]. == Location == {{coords|-4043|1327|1056}} Found in [[Asylum]]. After climbing a set of stars inside the first building after the courtyard, the item is at the top on one of the catwalks. {{Navbox/Shields}} 181aab1accc7978058774e9cab9eea6c94c3154c Night Horror 0 377 516 2025-07-21T04:17:19Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote |In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote |In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but it's difficult to truly say they have survived. This lone individual, if they can still be called such, exists in a state that blurs the line between life and death, their being a twisted echo of humanity amidst the torment. The banshee's cries seem to emanate from this tormented soul, a haunting reminder of the asylum's dark legacy and the incomprehensible suffering endured within its dark halls. }} == Location == {{coords|-3811|1199|9172}} Found in [[Asylum|the Asylum]]. Located below a staircase after leaving the first building. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] fc7ee13e9ef0e02cd4a7722f0e91cb2e83028519 Sentinel 0 485 734 2025-07-21T04:43:45Z Sharparam 284703 Created page with "{{Infobox/Armor set | image = Sentinel.png | title = {{PAGENAME}} | Helmet = Sentinel Helmet | Chestguard = Sentinel Chest | Legguard = Sentinel Legguard | Gauntlets = Sentinel Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}. == Location == {{coords|-3634|1305|9617}} The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and ge..." wikitext text/x-wiki {{Infobox/Armor set | image = Sentinel.png | title = {{PAGENAME}} | Helmet = Sentinel Helmet | Chestguard = Sentinel Chest | Legguard = Sentinel Legguard | Gauntlets = Sentinel Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}. == Location == {{coords|-3634|1305|9617}} The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and get to the bottom of the next room. Walk through the doorway and hug the left wall to reach an area behind a wall with a corpse sitting in a corner holding the armor set and the [[Daggers]]. {{Navbox/Armor}} c383d5b5ea00cce79216ed8915d5810d12cb993f Armor 0 466 696 2025-07-21T04:47:25Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' is protective [[equipment]] that can be worn to increase defensive stats. == List of armor == {{#cargo_query:table=Armor |fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, weight=Weight |format=table }} {{Navbox/Armor}} 9bd135cf1860c6152460f40d36e8fe2636fd7ef3 The Banshee 0 378 518 2025-07-21T05:37:26Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote | The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography sugg..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote | The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography suggests that the creature's wails are not merely cries of torment, but the remnants of a brutal experiment aimed at forging a living weapon. The movements, though now distorted and ghostly, hint at a once-formed discipline, twisted into a nightmarish mockery of the intended martial prowess. This spectral entity seems to embody the cruel ambition of those who sought to create a perfect instrument of war through unthinkable means. }} == Location == {{coords|-3943|1596|1532}} Found in the center of a circular room, surrounded by chairs, in the big tower in [[Asylum|the asylum]]. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 0309dfabb2c1cb6950f037a68ebce98a2b67b20f Template:Navbox/Items 10 285 319 318 2025-07-21T05:39:42Z Sharparam 284703 Add [[Plagued Blood]] wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Mobius Blade]] * [[Old Key]] * [[Plagued Blood]] * [[Scanner]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> b40f200532197c3923fcf2ffd79cb383740795bb 320 319 2025-07-23T01:17:51Z Sharparam 284703 Add homunculus mirage and perk essence wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> ddfce34a1183f816fb726793fbaee33e3e626bae 321 320 2025-07-23T04:06:46Z Sharparam 284703 Add upgrade items wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = Essential | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 5d993314d5a6d93f05f9e71fae3e58357d179daf Skullface Helmet 0 490 744 2025-07-21T05:47:59Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Skullface Helmet.png | Type = Helmet | Weight = Light | Passives = [[Volatile Illusions]] | Mk5_Sharp = 692 | Mk5_Blunt = 692 | Mk5_Technomancy = 928 }} == Location == {{coords|-4063|1564|1686}} After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Skullface Helmet.png | Type = Helmet | Weight = Light | Passives = [[Volatile Illusions]] | Mk5_Sharp = 692 | Mk5_Blunt = 692 | Mk5_Technomancy = 928 }} == Location == {{coords|-4063|1564|1686}} After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet. {{Navbox/Armor}} 06db38be9569d6ea522dedf56d2264708ad17817 Vengeance 0 486 736 2025-07-21T05:51:00Z Sharparam 284703 Created page with "{{Infobox/Armor set | title = {{PAGENAME}} | image = Vengeance.png | Helmet = Vengeance Helmet | Chestguard = Vengeance Cuirass | Legguard = Vengeance Legs | Gauntlets = Vengeance Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}. == Location == {{coords|-3925|1676|9471}} Found on a corpse in the shortcut area leading to the big tower. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor set | title = {{PAGENAME}} | image = Vengeance.png | Helmet = Vengeance Helmet | Chestguard = Vengeance Cuirass | Legguard = Vengeance Legs | Gauntlets = Vengeance Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}. == Location == {{coords|-3925|1676|9471}} Found on a corpse in the shortcut area leading to the big tower. {{Navbox/Armor}} 37e805d19347a1c48db878ae9dc7e86a5905fb7b Hellicar's Maxims 0 379 520 2025-07-21T06:09:02Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}. == Acquisition == Drops from [[enemies]] in the game. * Asylum enemy with cape and sword+shield. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]]" wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}. == Acquisition == Drops from [[enemies]] in the game. * Asylum enemy with cape and sword+shield. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 9e54fe19f15f8d8dce8dd560ec5bc7a0f7a98dab Category:Bosses 14 540 840 2025-07-21T06:25:38Z Sharparam 284703 Created page with "[[Category:Enemies]]" wikitext text/x-wiki [[Category:Enemies]] d3da306a1b523dea15853a2b661da0200bf2f201 Enemies 0 537 834 2025-07-21T06:26:56Z Sharparam 284703 Created page with "{{Navbox/Enemies}}" wikitext text/x-wiki {{Navbox/Enemies}} 833889e0d1b529dbf02a0a7b4ded350913eaaadd Bosses 0 539 838 2025-07-21T06:28:40Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated. {{Navbox/Bosses}} 0c3e8dc2475799e24d9fb25b0d80bf435d40e02a Template:Infobox/Boss 10 461 686 2025-07-21T06:50:54Z Sharparam 284703 wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind = boss | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance | SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}} | BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}} | TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}} }}{{#if:{{NAMESPACE}}||[[Category:Bosses]]}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]] </noinclude> 64710a105198d7712f12bdaeab6e515bd71f2fe8 Template:Navbox/Data logs 10 290 350 349 2025-07-21T16:25:33Z Sharparam 284703 Add [[Shadows in the Courtyard]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> f20790d1177712318ffb0c575d91690d98c09f19 351 350 2025-07-23T01:24:56Z Sharparam 284703 Add [[Inhabitants]] and note on ordering wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 8805c049301dbd9643cf641fef2da91d8afdfbf0 352 351 2025-07-23T04:47:22Z Sharparam 284703 Add [[Serpentine Visions]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 8e02ca819e48ceaeec301d132d06e960ed6923a9 353 352 2025-07-23T06:03:21Z Sharparam 284703 Add [[Shifting Sands]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> b969662647d22a6cc9072e811cb3f2f163b91464 354 353 2025-07-23T09:35:40Z Sharparam 284703 Add [[Call of the Void]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 125ee0dcc36ec7294986a579187b61c57ec19bd5 355 354 2025-07-23T10:15:56Z Sharparam 284703 Add [[Umbral City]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 7c563198274471604afdcb166842cd0df6f210b0 356 355 2025-07-23T10:25:33Z Sharparam 284703 Add [[Intercepted Transmission]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ebf1841010ec3a6aa0d5dc427bd59a5986403681 357 356 2025-07-23T13:05:10Z Sharparam 284703 Add [[Desert Dream]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 1496e77efafb4db0cbdd7f82f39fcdf8abf52d0f Shadows in the Courtyard 0 380 522 2025-07-21T16:32:22Z Sharparam 284703 Fix typo wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | There's a radial pattern in [[Blok 6147|this Blok]]. A heavily pedestrian zone. The people living here must have had a rather communal spirit. I can't tell if it's just my mind, but I can hear the echoes of children shouting. The ring of a school bell. The creek of a rusty gate opening and closing in a morning ritual. I imagine some of the views here are rather stunning. }} == Location == {{coords|-1016|-3857|2319}} Found in [[Blok 6147]], on a round balcony overlooking the central hub. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 3ea9546e3cf140db20981b41b9f9f6e2f674c210 Module:Check for unknown parameters 828 614 965 2025-07-22T11:58:12Z Sharparam 284703 1 revision imported Scribunto text/plain -- This module may be used to compare the arguments passed to the parent -- with a list of arguments, returning a specified result if an argument is -- not on the list local p = {} local function trim(s) return s:match('^%s*(.-)%s*$') end local function isnotempty(s) return s and trim(s) ~= '' end function p.check (frame) local args = frame.args local pargs = frame:getParent().args local ignoreblank = isnotempty(frame.args['ignoreblank']) local checkpos = isnotempty(frame.args['checkpositional']) local knownargs = {} local unknown = frame.args['unknown'] or 'Found _VALUE_, ' local preview = frame.args['preview'] local res = {} local regexps = {} local comments = {} local commentstr = '' local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0 -- create the list of known args, regular expressions, and the return string for k, v in pairs(args) do if type(k) == 'number' then v = trim(v) knownargs[v] = 1 elseif k:find('^regexp[1-9][0-9]*$') then table.insert(regexps, '^' .. v .. '$') end end if isnotempty(preview) then preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>' elseif preview == nil then preview = unknown end if ispreview == 1 then unknown = preview ignoreblank = false end -- adds one result to the output tables local function addresult(k) if k == '' then -- Fix odd bug for | = which gets stripped to the empty string and -- breaks category links k = ' ' end local r = unknown:gsub('_VALUE_', k) table.insert(res, r) table.insert(comments, '"' .. k .. '"') end -- loop over the parent args, and make sure they are on the list for k, v in pairs(pargs) do if type(k) == 'string' and knownargs[k] == nil then local knownflag = false for i, regexp in ipairs(regexps) do if mw.ustring.match(k, regexp) then knownflag = true break end end if not knownflag and ( not ignoreblank or isnotempty(v) ) then k = mw.ustring.gsub(k, '[^%w%-_ ]', '?') addresult(k) end elseif checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil and ( not ignoreblank or isnotempty(v) ) then addresult(k) end end if #comments > 0 then commentstr = '<!-- Module:Check for unknown parameters results: ' .. table.concat(comments, ', ') .. '-->' end return table.concat(res) .. commentstr end return p 90cb45a6cbe02f0d73cbfdec8233df899b000e3d Agility 0 711 1088 2025-07-22T13:14:28Z Sharparam 284703 Add missing category wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects stats related to critical chance, stamina, speed, and boss resistance to arrows. == Overview == Critical chance and melee swing speed both have a hard cap at 100. The hard caps for other stats can be seen in the table when their increment amount drops to zero. <!--<div class="noresize">--> {| class="wikitable hover-highlight mw-collapsible mw-collapsed sortable sticky-header-multi" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Agility ! class="unsortable" scope="col" rowspan="2" | Crit chance ! class="unsortable" scope="col" rowspan="2" | Stamina ! class="unsortable" scope="col" rowspan="2" | Stam delay ! class="unsortable" scope="col" rowspan="2" | Move speed ! class="unsortable" scope="col" rowspan="2" | Melee swing speed ! class="unsortable" scope="col" rowspan="2" | Range wep draw spd pen ! class="unsortable" scope="col" rowspan="2" | Boss arrow res reduction ! class="unsortable" scope="col" colspan="7" | Increments |- ! class="unsortable" scope="col" | Crit chance ! class="unsortable" scope="col" | Stamina ! class="unsortable" scope="col" | Stam delay ! class="unsortable" scope="col" | Move speed ! class="unsortable" scope="col" | Melee swing speed ! class="unsortable" scope="col" | Range wep draw spd pen ! class="unsortable" scope="col" | Boss arrow res reduction |- | 0 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 25.00% || 0% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 0.00% || 0% |- | 1 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 23.89% || 1% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 2 || 0.25% || 105 || 1.90 || 100.00% || 100.0% || 22.78% || 2% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 3 || 0.50% || 105 || 1.90 || 100.00% || 100.0% || 21.67% || 3% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 4 || 0.75% || 105 || 1.90 || 100.00% || 100.0% || 20.56% || 4% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 5 || 1.00% || 105 || 1.90 || 100.00% || 100.0% || 19.45% || 5% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 6 || 1.50% || 107 || 1.89 || 100.00% || 100.0% || 18.34% || 6% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 7 || 2.00% || 109 || 1.88 || 100.00% || 100.0% || 17.23% || 7% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 8 || 2.50% || 111 || 1.87 || 100.00% || 100.0% || 16.12% || 8% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 9 || 3.00% || 113 || 1.86 || 100.00% || 100.0% || 15.01% || 9% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 10 || 3.50% || 115 || 1.85 || 100.00% || 100.0% || 13.90% || 10% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 11 || 4.10% || 117 || 1.84 || 100.00% || 100.0% || 12.79% || 11% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 12 || 4.70% || 119 || 1.83 || 100.00% || 100.0% || 11.68% || 12% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 13 || 5.30% || 121 || 1.82 || 100.00% || 100.0% || 10.57% || 13% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 14 || 5.90% || 123 || 1.81 || 100.00% || 100.0% || 9.46% || 14% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 15 || 6.50% || 125 || 1.80 || 100.00% || 100.0% || 8.35% || 15% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 16 || 9.07% || 127 || 1.79 || 100.17% || 100.5% || 7.24% || 16% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 17 || 11.64% || 129 || 1.78 || 100.34% || 101.0% || 6.13% || 17% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 18 || 14.21% || 131 || 1.77 || 100.51% || 101.5% || 5.02% || 18% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 19 || 16.78% || 133 || 1.76 || 100.68% || 102.0% || 3.91% || 19% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 20 || 19.35% || 135 || 1.75 || 100.85% || 102.5% || 2.80% || 20% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 21 || 21.92% || 137 || 1.74 || 101.02% || 103.0% || 1.69% || 21% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 22 || 24.49% || 139 || 1.73 || 101.19% || 103.5% || 0.58% || 22% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 23 || 27.06% || 141 || 1.72 || 101.36% || 104.0% || -0.53% || 23% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 24 || 29.63% || 143 || 1.71 || 101.53% || 104.5% || -1.64% || 24% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 25 || 32.20% || 145 || 1.70 || 101.70% || 105.0% || -2.75% || 25% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 26 || 34.77% || 147 || 1.69 || 101.87% || 105.5% || -3.86% || 26% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 27 || 37.34% || 149 || 1.68 || 102.04% || 106.0% || -4.97% || 27% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 28 || 39.91% || 151 || 1.67 || 102.21% || 106.5% || -6.08% || 28% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 29 || 42.48% || 153 || 1.66 || 102.38% || 107.0% || -7.19% || 29% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 30 || 45.05% || 155 || 1.65 || 102.55% || 107.5% || -8.30% || 30% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 31 || 46.05% || 157 || 1.64 || 102.72% || 108.0% || -9.41% || 31% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 32 || 47.05% || 159 || 1.63 || 102.89% || 108.5% || -10.52% || 32% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 33 || 48.05% || 161 || 1.62 || 103.06% || 109.0% || -11.63% || 33% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 34 || 49.05% || 163 || 1.61 || 103.23% || 109.5% || -12.74% || 34% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 35 || 50.05% || 165 || 1.60 || 103.40% || 110.0% || -13.85% || 35% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 36 || 51.05% || 167 || 1.59 || 103.57% || 110.5% || -14.96% || 36% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 37 || 52.05% || 169 || 1.58 || 103.74% || 111.0% || -16.07% || 37% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 38 || 53.05% || 171 || 1.57 || 103.91% || 111.5% || -17.18% || 38% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 39 || 54.05% || 173 || 1.56 || 104.08% || 112.0% || -18.29% || 39% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 40 || 55.05% || 175 || 1.55 || 104.25% || 112.5% || -19.40% || 40% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 41 || 56.05% || 177 || 1.54 || 104.42% || 113.0% || -20.51% || 41% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 42 || 57.05% || 179 || 1.53 || 104.59% || 113.5% || -21.62% || 42% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 43 || 58.05% || 181 || 1.52 || 104.76% || 114.0% || -22.73% || 43% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 44 || 59.05% || 183 || 1.51 || 104.93% || 114.5% || -23.84% || 44% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 45 || 60.05% || 185 || 1.50 || 105.10% || 115.0% || -24.95% || 45% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 46 || 61.05% || 186 || 1.50 || 105.24% || 115.5% || -24.95% || 46% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 47 || 62.05% || 187 || 1.50 || 105.38% || 116.0% || -24.95% || 47% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 48 || 63.05% || 188 || 1.50 || 105.52% || 116.5% || -24.95% || 48% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 49 || 64.05% || 189 || 1.50 || 105.66% || 117.0% || -24.95% || 49% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 50 || 65.05% || 190 || 1.50 || 105.80% || 117.5% || -24.95% || 50% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 51 || 65.45% || 191 || 1.50 || 105.94% || 117.7% || -24.95% || 51% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 52 || 65.85% || 192 || 1.50 || 106.08% || 117.9% || -24.95% || 52% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 53 || 66.25% || 193 || 1.50 || 106.22% || 118.1% || -24.95% || 53% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 54 || 66.65% || 194 || 1.50 || 106.36% || 118.3% || -24.95% || 54% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 55 || 67.05% || 195 || 1.50 || 106.50% || 118.5% || -24.95% || 55% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 56 || 67.45% || 196 || 1.50 || 106.64% || 118.7% || -24.95% || 56% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 57 || 67.85% || 197 || 1.50 || 106.78% || 118.9% || -24.95% || 57% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 58 || 68.25% || 198 || 1.50 || 106.92% || 119.1% || -24.95% || 58% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 59 || 68.65% || 199 || 1.50 || 107.06% || 119.3% || -24.95% || 59% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 60 || 69.05% || 200 || 1.50 || 107.20% || 119.5% || -24.95% || 60% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 61 || 69.45% || 201 || 1.50 || 107.34% || 119.7% || -24.95% || 61% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 62 || 69.85% || 202 || 1.50 || 107.48% || 119.9% || -24.95% || 62% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 63 || 70.25% || 203 || 1.50 || 107.62% || 120.1% || -24.95% || 63% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 64 || 70.65% || 204 || 1.50 || 107.76% || 120.3% || -24.95% || 64% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 65 || 71.05% || 205 || 1.50 || 107.90% || 120.5% || -24.95% || 65% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 66 || 71.45% || 206 || 1.50 || 108.04% || 120.7% || -24.95% || 66% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 67 || 71.85% || 207 || 1.50 || 108.18% || 120.9% || -24.95% || 67% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 68 || 72.25% || 208 || 1.50 || 108.32% || 121.1% || -24.95% || 68% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 69 || 72.65% || 209 || 1.50 || 108.46% || 121.3% || -24.95% || 69% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 70 || 73.05% || 210 || 1.50 || 108.60% || 121.5% || -24.95% || 70% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 71 || 73.45% || 211 || 1.50 || 108.74% || 121.7% || -24.95% || 71% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 72 || 73.85% || 212 || 1.50 || 108.88% || 121.9% || -24.95% || 72% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 73 || 74.25% || 213 || 1.50 || 109.02% || 122.1% || -24.95% || 73% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 74 || 74.65% || 214 || 1.50 || 109.16% || 122.3% || -24.95% || 74% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 75 || 75.05% || 215 || 1.50 || 109.30% || 122.5% || -24.95% || 75% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 76 || 75.25% || 216 || 1.50 || 109.44% || 122.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 77 || 75.45% || 217 || 1.50 || 109.58% || 122.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 78 || 75.65% || 218 || 1.50 || 109.72% || 122.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 79 || 75.85% || 219 || 1.50 || 109.86% || 122.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 80 || 76.05% || 220 || 1.50 || 110.00% || 123.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 81 || 76.25% || 221 || 1.50 || 110.00% || 123.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 82 || 76.45% || 222 || 1.50 || 110.00% || 123.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 83 || 76.65% || 223 || 1.50 || 110.00% || 123.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 84 || 76.85% || 224 || 1.50 || 110.00% || 123.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 85 || 77.05% || 225 || 1.50 || 110.00% || 123.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 86 || 77.25% || 226 || 1.50 || 110.00% || 123.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 87 || 77.45% || 227 || 1.50 || 110.00% || 123.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 88 || 77.65% || 228 || 1.50 || 110.00% || 123.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 89 || 77.85% || 229 || 1.50 || 110.00% || 123.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 90 || 78.05% || 230 || 1.50 || 110.00% || 124.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 91 || 78.25% || 231 || 1.50 || 110.00% || 124.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 92 || 78.45% || 232 || 1.50 || 110.00% || 124.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 93 || 78.65% || 233 || 1.50 || 110.00% || 124.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 94 || 78.85% || 234 || 1.50 || 110.00% || 124.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 95 || 79.05% || 235 || 1.50 || 110.00% || 124.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 96 || 79.25% || 236 || 1.50 || 110.00% || 124.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 97 || 79.45% || 237 || 1.50 || 110.00% || 124.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 98 || 79.65% || 238 || 1.50 || 110.00% || 124.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 99 || 79.85% || 239 || 1.50 || 110.00% || 124.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 100 || 80.05% || 240 || 1.50 || 110.00% || 125.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |} <!--</div>--> [[Category:Attributes]] 7a701b76e512860658a8b6ad71e4474cbf3409ce Category:Attributes 14 708 1082 2025-07-22T13:14:41Z Sharparam 284703 Created page with "[[Category:Game mechanics]]" wikitext text/x-wiki [[Category:Game mechanics]] f2739a7f6d15068b5f220f8cbb0a1aa293521862 Strength 0 710 1086 2025-07-22T13:16:16Z Sharparam 284703 Improve table wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects weapon damage and max weight. == Overview == Strength affects bonus weapon damage, as well as the max weight which affects encumbrance. The gain to max weight is {{val|450|u=g}} for every attribute point until 45, which is the last to give the increment. Every additional level into strength after that will not increase max weight, so it has a hard cap of {{val|40.5|u=kg}}. The gain to bonus weapon damage is always 10.8%, but going past 92 shows the total bonus damage as always being 1%. It is unclear if this is just a visual bug or if the bonus damage actually does drop down to 1%. {| class="wikitable sortable hover-highlight sticky-header-multi mw-collapsible mw-collapsed" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Strength ! class="unsortable" scope="col" rowspan="2" | +Weapon DMG ! class="unsortable" scope="col" rowspan="2" | Max weight (g) ! class="unsortable" scope="col" colspan="2" | Increments |- ! class="unsortable" scope="col" | +Weapon DMG ! class="unsortable" scope="col" | Max weight (g) |- | 0 || 0.0% || {{fnum|20250}} || 0.0% || 0 |- | 1 || 10.8% || {{fnum|20700}} || 10.8% || 450 |- | 2 || 21.6% || {{fnum|21150}} || 10.8% || 450 |- | 3 || 32.4% || {{fnum|21600}} || 10.8% || 450 |- | 4 || 43.2% || {{fnum|22050}} || 10.8% || 450 |- | 5 || 54.0% || {{fnum|22500}} || 10.8% || 450 |- | 6 || 64.8% || {{fnum|22950}} || 10.8% || 450 |- | 7 || 75.6% || {{fnum|23400}} || 10.8% || 450 |- | 8 || 86.4% || {{fnum|23850}} || 10.8% || 450 |- | 9 || 97.2% || {{fnum|24300}} || 10.8% || 450 |- | 10 || 108.0% || {{fnum|24750}} || 10.8% || 450 |- | 11 || 118.8% || {{fnum|25200}} || 10.8% || 450 |- | 12 || 129.6% || {{fnum|25650}} || 10.8% || 450 |- | 13 || 140.4% || {{fnum|26100}} || 10.8% || 450 |- | 14 || 151.2% || {{fnum|26550}} || 10.8% || 450 |- | 15 || 162.0% || {{fnum|27000}} || 10.8% || 450 |- | 16 || 172.8% || {{fnum|27450}} || 10.8% || 450 |- | 17 || 183.6% || {{fnum|27900}} || 10.8% || 450 |- | 18 || 194.4% || {{fnum|28350}} || 10.8% || 450 |- | 19 || 205.2% || {{fnum|28800}} || 10.8% || 450 |- | 20 || 216.0% || {{fnum|29250}} || 10.8% || 450 |- | 21 || 226.8% || {{fnum|29700}} || 10.8% || 450 |- | 22 || 237.6% || {{fnum|30150}} || 10.8% || 450 |- | 23 || 248.4% || {{fnum|30600}} || 10.8% || 450 |- | 24 || 259.2% || {{fnum|31050}} || 10.8% || 450 |- | 25 || 270.0% || {{fnum|31500}} || 10.8% || 450 |- | 26 || 280.8% || {{fnum|31950}} || 10.8% || 450 |- | 27 || 291.6% || {{fnum|32400}} || 10.8% || 450 |- | 28 || 302.4% || {{fnum|32850}} || 10.8% || 450 |- | 29 || 313.2% || {{fnum|33300}} || 10.8% || 450 |- | 30 || 324.0% || {{fnum|33750}} || 10.8% || 450 |- | 31 || 334.8% || {{fnum|34200}} || 10.8% || 450 |- | 32 || 345.6% || {{fnum|34650}} || 10.8% || 450 |- | 33 || 356.4% || {{fnum|35100}} || 10.8% || 450 |- | 34 || 367.2% || {{fnum|35550}} || 10.8% || 450 |- | 35 || 378.0% || {{fnum|36000}} || 10.8% || 450 |- | 36 || 388.8% || {{fnum|36450}} || 10.8% || 450 |- | 37 || 399.6% || {{fnum|36900}} || 10.8% || 450 |- | 38 || 410.4% || {{fnum|37350}} || 10.8% || 450 |- | 39 || 421.2% || {{fnum|37800}} || 10.8% || 450 |- | 40 || 432.0% || {{fnum|38250}} || 10.8% || 450 |- | 41 || 442.8% || {{fnum|38700}} || 10.8% || 450 |- | 42 || 453.6% || {{fnum|39150}} || 10.8% || 450 |- | 43 || 464.4% || {{fnum|39600}} || 10.8% || 450 |- | 44 || 475.2% || {{fnum|40050}} || 10.8% || 450 |- | 45 || 486.0% || {{fnum|40500}} || 10.8% || 450 |- | 46 || 496.8% || {{fnum|40500}} || 10.8% || 0 |- | 47 || 507.6% || {{fnum|40500}} || 10.8% || 0 |- | 48 || 518.4% || {{fnum|40500}} || 10.8% || 0 |- | 49 || 529.2% || {{fnum|40500}} || 10.8% || 0 |- | 50 || 540.0% || {{fnum|40500}} || 10.8% || 0 |- | 51 || 550.8% || {{fnum|40500}} || 10.8% || 0 |- | 52 || 561.6% || {{fnum|40500}} || 10.8% || 0 |- | 53 || 572.4% || {{fnum|40500}} || 10.8% || 0 |- | 54 || 583.2% || {{fnum|40500}} || 10.8% || 0 |- | 55 || 594.0% || {{fnum|40500}} || 10.8% || 0 |- | 56 || 604.8% || {{fnum|40500}} || 10.8% || 0 |- | 57 || 615.6% || {{fnum|40500}} || 10.8% || 0 |- | 58 || 626.4% || {{fnum|40500}} || 10.8% || 0 |- | 59 || 637.2% || {{fnum|40500}} || 10.8% || 0 |- | 60 || 648.0% || {{fnum|40500}} || 10.8% || 0 |- | 61 || 658.8% || {{fnum|40500}} || 10.8% || 0 |- | 62 || 669.6% || {{fnum|40500}} || 10.8% || 0 |- | 63 || 680.4% || {{fnum|40500}} || 10.8% || 0 |- | 64 || 691.2% || {{fnum|40500}} || 10.8% || 0 |- | 65 || 702.0% || {{fnum|40500}} || 10.8% || 0 |- | 66 || 712.8% || {{fnum|40500}} || 10.8% || 0 |- | 67 || 723.6% || {{fnum|40500}} || 10.8% || 0 |- | 68 || 734.4% || {{fnum|40500}} || 10.8% || 0 |- | 69 || 745.2% || {{fnum|40500}} || 10.8% || 0 |- | 70 || 756.0% || {{fnum|40500}} || 10.8% || 0 |- | 71 || 766.8% || {{fnum|40500}} || 10.8% || 0 |- | 72 || 777.6% || {{fnum|40500}} || 10.8% || 0 |- | 73 || 788.4% || {{fnum|40500}} || 10.8% || 0 |- | 74 || 799.2% || {{fnum|40500}} || 10.8% || 0 |- | 75 || 810.0% || {{fnum|40500}} || 10.8% || 0 |- | 76 || 820.8% || {{fnum|40500}} || 10.8% || 0 |- | 77 || 831.6% || {{fnum|40500}} || 10.8% || 0 |- | 78 || 842.4% || {{fnum|40500}} || 10.8% || 0 |- | 79 || 853.2% || {{fnum|40500}} || 10.8% || 0 |- | 80 || 864.0% || {{fnum|40500}} || 10.8% || 0 |- | 81 || 874.8% || {{fnum|40500}} || 10.8% || 0 |- | 82 || 885.6% || {{fnum|40500}} || 10.8% || 0 |- | 83 || 896.4% || {{fnum|40500}} || 10.8% || 0 |- | 84 || 907.2% || {{fnum|40500}} || 10.8% || 0 |- | 85 || 918.0% || {{fnum|40500}} || 10.8% || 0 |- | 86 || 928.8% || {{fnum|40500}} || 10.8% || 0 |- | 87 || 939.6% || {{fnum|40500}} || 10.8% || 0 |- | 88 || 950.4% || {{fnum|40500}} || 10.8% || 0 |- | 89 || 961.2% || {{fnum|40500}} || 10.8% || 0 |- | 90 || 972.0% || {{fnum|40500}} || 10.8% || 0 |- | 91 || 982.8% || {{fnum|40500}} || 10.8% || 0 |- | 92 || 993.6% || {{fnum|40500}} || 10.8% || 0 |} [[Category:Attributes]] acf936b03bf018cd91d4c8f8790137535cf71c2d Attributes 0 712 1090 2025-07-22T13:19:55Z Sharparam 284703 Link to level wikitext text/x-wiki '''{{PAGENAME}}''' determine the player's [[stats]]. == Overview == Each time the player [[Level|levels up]], they get two points to spend on one of the four attributes. == Strength == {{main|Strength}} == Agility == {{main|Agility}} == Intelligence == {{main|Intelligence}} == Constitution == {{main|Constitution}} [[Category:Attributes]] 9e68b22348fa67fdf1237f31b0043c8996b44821 Blok 6174 0 741 1142 2025-07-23T00:15:54Z Sharparam 284703 Redirected page to [[Blok 6147]] wikitext text/x-wiki #REDIRECT [[Blok 6147]] 3ee370bab2292ee469f53ad5d06af212bbb3db85 Template:Infobox/Item 10 417 596 2025-07-23T00:44:01Z Sharparam 284703 Use alternative method for description wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{#if:{{NAMESPACE}}||[[Category:Items]]}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> 5d4929aef36fffdaea5150152baf68fb562131a0 Silicon Visage 0 543 846 2025-07-23T00:59:56Z Sharparam 284703 Created page with "{{Infobox/Boss | image = Silicon Visage.png | SharpResist = 15 | BluntResist = 16 | TechnomancyResist = 55 }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|9307|2902|1628}} (approximate) Located in [[Upper Blocks]]. == Drops == * [[Upgrade Module]] * [[Unstable Perk Essence]] {{Navbox/Bosses}}" wikitext text/x-wiki {{Infobox/Boss | image = Silicon Visage.png | SharpResist = 15 | BluntResist = 16 | TechnomancyResist = 55 }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|9307|2902|1628}} (approximate) Located in [[Upper Blocks]]. == Drops == * [[Upgrade Module]] * [[Unstable Perk Essence]] {{Navbox/Bosses}} 773d7fa0e470181a1ad1ada63a49044d0679caf7 Homunculus Mirage 0 423 608 2025-07-23T01:18:18Z Sharparam 284703 Add navbox wikitext text/x-wiki {{Infobox/Item | tabs=Normal,Husk | Normal_title = Homunculus Mirage | Husk_title = Humunculus Mirage Husk | images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]] | Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation. | Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere. }} {{Navbox/Items}} [[Category:Essential items]] 8fb75994fa6cda97b1ebe8cfd760652188977f94 Inhabitants 0 381 524 2025-07-23T01:23:54Z Sharparam 284703 Created page with "{{stub}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slo..." wikitext text/x-wiki {{stub}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 1fac3c562d846adb7b3b2e5ab3eb4d386c14b532 Upgrade Module 0 425 612 2025-07-23T04:05:28Z Sharparam 284703 Created page with "{{Infobox/Item | title = {{PAGENAME}} | image = Upgrade Module.png | Description = A rare artifact used in the process of upgrading gear. }} '''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5. {{Navbox/Items}} [[Category:Essential items]] [[Category:Upgrade items]]" wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Upgrade Module.png | Description = A rare artifact used in the process of upgrading gear. }} '''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5. {{Navbox/Items}} [[Category:Essential items]] [[Category:Upgrade items]] f405ef0912d49ef39a269fb10d08d14c1e5322bb Upgrade Splinter 0 432 626 2025-07-23T04:08:00Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}} |} {{Navbox/Items}} [[Category:Upgrade items]] b5014301a8a656873f94d981f8cd2ac3b7f1bbb7 Serpentine Visions 0 382 526 2025-07-23T04:47:01Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortle..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortlessly through the narrow gaps between the tower, its long, undulating body casting an imposing shadow over the pristine surfaces below. its presence, though non-threatening, is a constant reminder of the vastness and wildness that still lingers even in this meticulously engineered urban landscape. The serpent's slow, deliberate light adds a touch of majesty and enigma to the stark cityscape, making its silent passage through the towering structures a mesmerizing spectacle that commands both reverence and respect. }} == Location == {{coords|9922|-6769|1440}} Found in [[Uranopolis]] on a ledge on one of the platforms reached by navigating the bridges. Use [[Scanner|the scanner]] to find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] e002a14503e5a3d60e77f6a2a8484fc1381a05d3 Amulet of Arcane Protection 0 516 795 2025-07-23T05:23:22Z Sharparam 284703 Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Arcane Protection.png | Passives = [[Techno-Defiance]] | Effect1 = +1500 [[Technomancy]] armor rating. }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|4158|-2902|1459}} Found near the top side of a shortcut ladder in [[Uranopolis]]. {{Navbox/Amulets}}" wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Arcane Protection.png | Passives = [[Techno-Defiance]] | Effect1 = +1500 [[Technomancy]] armor rating. }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|4158|-2902|1459}} Found near the top side of a shortcut ladder in [[Uranopolis]]. {{Navbox/Amulets}} 18efef3d358787360eb91c39568ddbe8822cdf47 Amulets 0 444 653 2025-07-23T05:24:10Z Sharparam 284703 Created page with "{{Navbox/Amulets}}" wikitext text/x-wiki {{Navbox/Amulets}} c49a050c320d9cc83e8ac20203557bb1adb26913 Template:Navbox/Rings 10 292 371 370 2025-07-23T05:38:00Z Sharparam 284703 Add [[Ring of Casting Speed]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 22577f5f9b1a9c7ae8bcc3b8f4ebca96fa12d371 372 371 2025-07-23T11:32:02Z Sharparam 284703 Add [[Ring of Rammstein]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Rammstein]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 1ca9d6b8b77cbd2e141c78a56821fba79d958916 Ring of Casting Speed 0 520 803 2025-07-23T05:40:02Z Sharparam 284703 Add note on acquisition wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Casting Speed.png | Effect1 = -10% attack power. | Effect2 = +20% technocasting speed. }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Acquisition == Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}. {{Navbox/Rings}} 46f3eb13e5516b422e23a89fb5ec0e0a924ed783 Shifting Sands 0 383 528 2025-07-23T06:07:44Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about it. Its nature alludes to something of maker origin. Something capable of changing the structure. }} == Location == {{coords|-9400|7378|-1350}} Found in [[Desert|the Desert]], near the big enemy with red eyes after crossing the bridge past the [[Homunculus]]. It is in front of a set of doors. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] b48a873694f25c03f22938908578b61c6b9c4912 Call of the Void 0 384 530 2025-07-23T09:40:14Z Sharparam 284703 Add missing location info wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The giant staircase looms before me, its sheer expanse a vertiginous marvel that seems to stretch endlessly downward into the void. Each step is a monstrous slab of cold, unfeeling metal, worn smooth by countless unknown feet. As I descend, the sense of vertigo intensifies, and the emptiness below grows ever more profound. The abyss at the base of the staircase seems to call out with an irresistible allure, a dark, seductive whisper that tugs at the edges of my mind. The staircase feels alive with this haunting invitation, a siren song of emptiness that beckons irresistibly into the darkness below. }} == Location == {{coords|1132|-8482|1965}} Found in [[Ghost Town#Floor 13|Ghost Town (Floor 13)]]. Starting from the [[Homunculus]], head down the stairs. Head up the stairs behind the crying enemy at the bottom and the data log will be at the end of the walkway. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 6926f68eafdb547e25880491f97dcb505ad73b95 Amulet of Evasion 0 517 797 2025-07-23T10:01:14Z Sharparam 284703 Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Evasion.png | Passives = [[Extended Evasion]] }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|1251|-8419|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right..." wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Evasion.png | Passives = [[Extended Evasion]] }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|1251|-8419|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building. {{Navbox/Amulets}} 9e21e16f6b5f152489ca325ce8295f57ce37b702 Umbral City 0 385 532 2025-07-23T10:20:41Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, s..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, shrouded in the same pervasive mist. The gravestones, ancient and crumbling, stood like mournful sentinels in the ghostly fog. I could feel a strange, unsettling energy emanating from the ground, a spectral force that seemed to pulse through the halls around me. The sorrow and loss from the graveyard seeped into the very walls of this place, wrapping me in a shroud of grief. The haunting resonance of the graveyard's energy made every breath feel heavy, and the oppressive atmosphere left me with an unshakable sense of inescapable sorrow, as if the very essence of this forsaken place was reaching out to ensnare me. }} == Location == {{coords|1109|-9166|-1494}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], go through the doorway and take the right path, going down the stairs and following the corridors until you arrive at the subway. Go to the right and get to the end to find the data log in the corner. Use [[Scanner|the scanner]] to more easily find it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] f48b4c78d4059ac73cd01b56ac5efdc5e95bd143 Intercepted Transmission 0 386 534 2025-07-23T10:27:43Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you. }} == Location == {{coords|1908|-1765|-806}} In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you. }} == Location == {{coords|1908|-1765|-806}} In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] f7a214fac38ad015fc367e76f78b3c313073255d Spiked Shield 0 750 1160 2025-07-23T10:38:31Z Sharparam 284703 Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Spiked Shield.png | Weight = Heavy | Passives = [[Spikes]] | Mk0_Sharp = 48.6 | Mk0_Blunt = 54.6 | Mk0_Technomancy = 49.8 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Warden]]. {{Navbox/Shields}}" wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Spiked Shield.png | Weight = Heavy | Passives = [[Spikes]] | Mk0_Sharp = 48.6 | Mk0_Blunt = 54.6 | Mk0_Technomancy = 49.8 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Warden]]. {{Navbox/Shields}} 35d72a537a85e4efbf9cffb04c27d03f7ce129cf Level 0 707 1080 2025-07-23T10:52:24Z Sharparam 284703 Add more level data wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''' is a measure of a player's experience. == Overview == The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects. The amount of experience points required to reach further levels will regularly increase, although not with every level. Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2. The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]]. {| class="wikitable sticky-header hover-highlight" style="text-align: right;" |- ! scope="col" | Level ! scope="col" | EXP to next ! scope="col" | Cost increase ! scope="col" | Total EXP |- | 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} |- | 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} |- | 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} |- | 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} |- | 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} |- | 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} |- | 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} |- | 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} |- | 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} |- | 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} |- | 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} |- | 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} |- | 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} |- | 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} |- | 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} |- | 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} |- | 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} |- | 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} |- | 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} |- | 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} |- | 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} |- | 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} |- | 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} |- | 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} |- | 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} |- | 25 || ??? || ??? || {{fnum|430950}} |} [[Category:Game mechanics]] 2d60aff79f3c19820de1c03f6ed887e247b40df6 Techpriest Helmet 0 491 746 2025-07-23T11:12:30Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Techpriest Helmet.png | Type = Helmet | Weight = Light | Passives = [[Minor Flux Regen]] | Mk5_Sharp = 722 | Mk5_Blunt = 722 | Mk5_Technomancy = 928 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1272|-8495|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the s..." wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Techpriest Helmet.png | Type = Helmet | Weight = Light | Passives = [[Minor Flux Regen]] | Mk5_Sharp = 722 | Mk5_Blunt = 722 | Mk5_Technomancy = 928 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1272|-8495|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner. {{Navbox/Armor}} a7a7b23c199012fb916ce23130908fb2796a023c Tech Shield 0 752 1164 2025-07-23T11:29:29Z Sharparam 284703 Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Tech Shield.png | Weight = Heavy | Abilities = [[Refraction]] | Mk2_Sharp = 42.7 | Mk2_Blunt = 47.6 | Mk2_Technomancy = 70 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{coords|1327|-9333|1892}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and..." wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Tech Shield.png | Weight = Heavy | Abilities = [[Refraction]] | Mk2_Sharp = 42.7 | Mk2_Blunt = 47.6 | Mk2_Technomancy = 70 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{coords|1327|-9333|1892}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and take the left path. At the end is a cliff, climb it by standing near it and repeatedly tapping the jump button. Once on top of the cliff, go to the right and you'll see the corpse with the item against a cliff wall. On the same corpse can also be found the [[Ring of Rammstein]]. {{Navbox/Shields}} 1e64b4aa14aac12ca5c32867c37f664acb36dedf Ring of Rammstein 0 521 805 2025-07-23T11:31:46Z Sharparam 284703 Created page with "{{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Rammstein.png | Passives = [[Momentum Strike]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{main|Tech Shield#Location}} This item is located on the same corpse as the [[Tech Shield]]. {{Navbox/Rings}}" wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Rammstein.png | Passives = [[Momentum Strike]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{main|Tech Shield#Location}} This item is located on the same corpse as the [[Tech Shield]]. {{Navbox/Rings}} 1bf2ae52125b19a63277c4ea076e1cf3f2107e6e Ability Splinter 0 430 622 2025-07-23T11:39:08Z Sharparam 284703 Add another splinter in ghost town floor 1 wikitext text/x-wiki '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]]. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them. |} {{Navbox/Items}} [[Category:Essential items]] 7b6f4fe171581f79b13cd24ed99204aef452dab4 Deserts Respirator Helmet 0 492 748 2025-07-23T12:55:56Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Deserts Respirator Helmet.png | Type = helmet | Weight = Medium | Mk2_Sharp = 545 | Mk2_Blunt = 633 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1367|6630|-1395}} Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]]. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Deserts Respirator Helmet.png | Type = helmet | Weight = Medium | Mk2_Sharp = 545 | Mk2_Blunt = 633 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1367|6630|-1395}} Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]]. {{Navbox/Armor}} 85a4c5a22cdde742f764acd2e76c15d11d03503d Desert Dream 0 387 536 2025-07-23T13:07:11Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related. }} == Location == {{coords|1471|6344|-1395}} Found in th..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related. }} == Location == {{coords|1471|6344|-1395}} Found in the [[Desert]]. It's located in front of the teleportation orb that leads to [[Desert Mirage]]. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] fb7777879af3c3d248160f4349e8cabe96b0e304 Template:Navbox/Rings 10 292 373 372 2025-07-23T14:04:35Z Sharparam 284703 Add [[Ring of Exceeding Talent]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Exceeding Talent]] * [[Ring of Rammstein]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 41ad293567046b38a2ccf209a3fa705c5e4a8431 374 373 2025-07-23T14:07:38Z Sharparam 284703 Add more rings wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Rammstein]] * [[Ring of Lesser Talent]] * [[Ring of Talent]] * [[Ring of Exceeding Talent]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 370f3235addc2ae182daa771a1fe2c1179b6433f Ring of Exceeding Talent 0 522 807 2025-07-23T14:07:05Z Sharparam 284703 Add notes on other ring versions wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Exceeding Talent.png | Effect1 = +3 [[Strength]] | Effect2 = +3 [[Agility]] | Effect3 = +3 [[Constitution]] | Effect4 = +3 [[Intelligence]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{coords|3720|1159|-1397}} Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]). == See also == * [[Ring of Lesser Talent]] – The weakest version of this ring. * [[Ring of Talent]] – A weaker version of this ring. {{Navbox/Rings}} bcbe61aaf34441d0c94fadf4e2d02dbe42c66205 Saracen Shield 0 749 1158 2025-07-23T14:10:02Z Sharparam 284703 Created page with "{{Infobox/Shield | title = {{PAGENAME}} | image = Saracen Shield.png | Weight = Heavy | Abilities = [[Regal Radiance]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 57.4 | Mk2_Technomancy = 69.3 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{cords|3760|1142|-1395}} Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield. {{Navbox/Shields}}" wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Saracen Shield.png | Weight = Heavy | Abilities = [[Regal Radiance]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 57.4 | Mk2_Technomancy = 69.3 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{cords|3760|1142|-1395}} Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield. {{Navbox/Shields}} 59fda45f4bdf41eba1f4a2bcf8c2764d16851685 Template:Navbox/Shields 10 440 640 2025-07-23T14:10:17Z Sharparam 284703 Add [[Saracen Shield]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Shields | title = [[Shields]] | list1 = * [[Flat Shield]] * [[Kite Shield]] * [[Military Shield]] * [[Saracen Shield]] * [[Spiked Shield]] * [[Tall Military Shield]] * [[Tech Shield]] * [[Wooden Shield]] }} 86b51292309060d7ff355bad7dc03a02f84ab69b Wormlord 0 547 854 2025-07-23T15:10:54Z Sharparam 284703 Fix typo wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Wormlord.png }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Overview == Defeating Wormlord is required to be able to access [[The Anomaly]]. == Location == {{coords|2550|-4122|-1198}} (approximate) Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} aedb9551379ee1f1febb972b361a1b8ee9e1c3fd Plagued Revenant 0 546 852 2025-07-23T15:49:07Z Sharparam 284703 Add drops wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Plagued Revenant.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|1432|-8866|199}} (approximate) Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After getting to the outdoors area, keep going straight until you get to the end, take a right and then left to get down to a cliff area. Go left and you'll see a mausoleum inside the cliff on the left with some graves in front of it. In front of the doors of this mausoleum is a helmet ({{coords|1409|-8884|190}}). Interacting with the helmet to attempt to take it will spawn the boss behind you. == Drops == * [[Anastasia]] * [[Plagued Revenant Helmet]] == Trivia == * When dying to this boss, crying can be heard during the loading screen. This could either be intentional or a result of the nearby crying enemy respawning. {{Navbox/Bosses}} 698530510328c2e5031366f6586a3eb9494a65e4 Plagued Revenant Helmet 0 493 750 2025-07-23T15:54:24Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Plagued Revenant Helmet.png | Type = Helmet | Weight = Medium | Mk5_Sharp = 883 | Mk5_Blunt = 1024 | Mk5_Technomancy = 540 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Plagued Revenant Helmet.png | Type = Helmet | Weight = Medium | Mk5_Sharp = 883 | Mk5_Blunt = 1024 | Mk5_Technomancy = 540 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Armor}} dcf20306f52ebb49a60617476143ab6a73580f6b Template:Navbox/Data logs 10 290 358 357 2025-07-23T16:10:07Z Sharparam 284703 Add [[Heartbeat]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 3c6a050fdfdb7b63e99e373283ffefe800945ed9 359 358 2025-07-23T21:55:30Z Sharparam 284703 Add [[Silent Streets]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Manta Rays]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> d07fb4d47edebed387a1692c9bb48a34db0f5a42 360 359 2025-07-23T22:03:53Z Sharparam 284703 Add [[Statues]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 4958d07a84a6bc62127f9a55e125eac5fdc500dd 361 360 2025-07-23T23:25:11Z Sharparam 284703 Add more data logs wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[The Structure]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> a51dfbf017a3f2bb41892278e10183b069414667 Heartbeat 0 388 538 2025-07-23T16:14:07Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here. }} == Location == {{coords|3326|-6471|-6573}} Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data log]] e6a4f885a6f4e9bd91ce07da3168957b45e7a308 Perk Essence 0 424 610 2025-07-23T16:34:38Z Sharparam 284703 wikitext text/x-wiki {{Infobox/Item | tabs = Stable,Unstable | images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]] | Stable_title = Perk Essence | Unstable_title = Unstable Perk Essence | Stable_Description = An artifact used in the process of embedding perks. | Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades. == Acquisition == The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]]. Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again. {{Navbox/Items}} [[Category:Essential items]] e1971e413ec50fbb2dc150383cacbe574eece1c5 Librarian Hood 0 494 752 2025-07-23T16:42:03Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Librarian Hood.png | Type = Helmet | Weight = Light | Set = Librarian | Mk1_Sharp = 371 | Mk1_Blunt = 371 | Mk1_Technomancy = 469 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Librarian (enemy)|librarian]] enemies. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Librarian Hood.png | Type = Helmet | Weight = Light | Set = Librarian | Mk1_Sharp = 371 | Mk1_Blunt = 371 | Mk1_Technomancy = 469 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Librarian (enemy)|librarian]] enemies. {{Navbox/Armor}} 524d688d52e40e59b69ca9f6a46e4f593a6fcdab Librarian (armor set) 0 487 738 2025-07-23T16:43:16Z Sharparam 284703 Fix names wikitext text/x-wiki {{Infobox/Armor set | image = Librarian.png | title = Librarian | Weight = Light | Helmet = Librarian Hood | Pauldrons = <!-- Librarian ??? --> | Chestguard = Librarian Overcoat | Legguard = Librarian Trousers | Gauntlets = <!-- Librarian ??? --> }} '''Librarian''' is an [[armor set]] in {{BFF}}. == Pieces == * [[Librarian Hood]] <!-- * [[Librarian ???]] --> * [[Librarian Overcoat]] * [[Librarian Trousers]] <!-- * [[Librarian ???]] --> {{Navbox/Armor}} ad355bf6137087d645f4fbb2ac96e384f57db8a8 Librarian 0 745 1150 2025-07-23T16:51:24Z Sharparam 284703 Created page with "'''Librarian''' may refer to: == Common meanings == * [[Librarian (armor set)]], a light armor set * [[Librarian (enemy)]], the enemy in the [[Monastery]] == See also == * [[Librarian Hood]] * [[Librarian Overcoat]] * [[Librarian Trousers]] {{Disambiguation}}" wikitext text/x-wiki '''Librarian''' may refer to: == Common meanings == * [[Librarian (armor set)]], a light armor set * [[Librarian (enemy)]], the enemy in the [[Monastery]] == See also == * [[Librarian Hood]] * [[Librarian Overcoat]] * [[Librarian Trousers]] {{Disambiguation}} c7eb5b123cb7063d1af9038ba92b3013df3b5b50 Katanas 0 475 714 2025-07-23T21:02:24Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Katanas.png | Type = Dual Wield | Speed = Fast | Damage type = Sharp | Abilities = Blade Dash, Whirlwind Strike | Mk3_Damage_min = 117 | Mk3_Damage_max = 130 | Mk4_Damage_min = 165 | Mk4_Damage_max = 183 | Mk5_Damage_min = 235 | Mk5_Damage_max = 261 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Available as a drop from [[enemies]] in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. {{Navbox/Weapons}} 4ab46d81614502ef87bbdcd436c9621993e809bd Anastasia 0 501 766 2025-07-23T21:03:19Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Anastasia.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Reanimate Dead, Silencing Reap | Mk3_Damage_min = 364 | Mk3_Damage_max = 408 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Weapons}} 999c96e5d8b0e959b4174e16951f4d2f08e6598c Arcane Bow 0 509 782 2025-07-23T21:11:05Z Sharparam 284703 Fix template call (via JWB) wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Arcane Bow.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Vermillion Judgment | Abilities = Arrow Twister | Mk2_Damage_min = 184 | Mk2_Damage_max = 197 | Mk3_Damage_min = 251 | Mk3_Damage_max = 267 | Mk4_Damage_min = 292 | Mk4_Damage_max = 312 | Mk5_Damage_min = 334 | Mk5_Damage_max = 356 }} '''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}. == Location == {{coords|1261|-8400|1563}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse. {{Navbox/Weapons}} 9ed7d6da9990d1b86ae941adf6cc8ea5f6b173fb Blades of Atropos 0 480 724 2025-07-23T21:11:13Z Sharparam 284703 Fix template call (via JWB) wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Blades of Atropos.png | Type = Dual Wield | Damage type = Sharp | Speed = Fast | Passives = Bloodthirst | Abilities = Phase | Mk0_Damage_min = 131 | Mk0_Damage_max = 145 | Mk1_Damage_min = 147 | Mk1_Damage_max = 164 | Mk2_Damage_min = 164 | Mk2_Damage_max = 182 | Mk3_Damage_min = 197 | Mk3_Damage_max = 218 | Mk4_Damage_min = 229 | Mk4_Damage_max = 255 | Mk5_Damage_min = 262 | Mk5_Damage_max = 291 }} '''{{PAGENAME}}''' are a [[Dual Wields|dual wield]] weapon in {{BFF}}. == Location == {{coords|2778|-6115|-1198}} Found in [[Desert Mirage]]. Just down the stairs from the [[Homunculus]]. {{Navbox/Weapons}} 52da0a005c0bcb26cb17a6ee2da89b32c687e4ea Paladin Mace 0 497 758 2025-07-23T21:11:38Z Sharparam 284703 Fix template call (via JWB) wikitext text/x-wiki {{Infobox/Weapon | image = Paladin Mace.png | title = {{PAGENAME}} | Type = one-handed | Damage type = Blunt | Speed = Fast | Abilities = Divine Blessing | Mk0_Damage_min = 76 | Mk0_Damage_max = 83 | Mk1_Damage_min = 85 | Mk1_Damage_max = 93 | Mk2_Damage_min = 95 | Mk2_Damage_max = 104 }} '''{{PAGENAME}}''' is a [[One-handed weapons|one-handed]] [[Weapons|weapon]] that can be found in {{BFF}}. == Location == {{coords|-4879|-7530|5578}} In [[Deluge|the Deluge]]. Located in a square hole in the wall inside the first rectangular structure with pillars after crossing a bridge. The [[Items|item]] can be seen straight ahead when crossing the bridge. {{Navbox/Weapons}} 9ae9ef12f0012f7ee76e8b19eb462a731a31721f Scimitar 0 498 760 2025-07-23T21:11:43Z Sharparam 284703 Fix template call (via JWB) wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Scimitar.png | Type = One-handed | Damage type = Sharp | Speed = Swift | Abilities = Whiplash | Mk2_Damage_min = 150 | Mk2_Damage_max = 163 }} '''{{PAGENAME}}''' is a [[One-handed weapons|one-handed weapon]] in {{BFF}}. == Location == {{coords|1713|7517|-1413}} Located inside a building in the [[Desert]], after getting down on the bottom. {{Navbox/Weapons}} 7da5444707df0750219ed6dda415a75ee3b04a8e Asklepios 0 506 776 2025-07-23T21:13:46Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Asklepios.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Mending Light, Second Breath | Mk3_Damage_min = 117 | Mk3_Damage_max = 120 }} '''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}. == Acquisition == Dropped by big floating knights with blue lightsabers in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. {{Navbox/Weapons}} 19d3bc07174d18e309f111ea29df123b354aac8e Crescent Axe 0 502 768 2025-07-23T21:14:14Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Crescent Axe.png | Type = two-handed | Damage type = Sharp | Speed = Slow | Abilities = Expose Armor, Crescent Slash | Mk2_Damage_min = 251 | Mk2_Damage_max = 271 }} == Location == {{coords|-3932|1535|1532}} Located in the room with [[The Banshee]] [[Data logs|data log]]. 6ae8e711635fe9f28bf31f5f61c2b8a34e8e0452 Khopeshs 0 479 722 2025-07-23T21:14:57Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Khopeshs.png | Type = Dual Wield | Damage type = Sharp | Speed = Fast | Abilities = Dual Brutality, Bladestorm | Mk0_Damage_min = 92 | Mk0_Damage_max = 102 | Mk1_Damage_min = 104 | Mk1_Damage_max = 115 | Mk2_Damage_min = 115 | Mk2_Damage_max = 128 | Mk3_Damage_min = 139 | Mk3_Damage_max = 154 }} '''{{PAGENAME}}''' are a type of [[Dual Wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Nemesis]]. {{Navbox/Weapons}} c8f5f702bd2d22af0adff4ad34825ffb25021210 Lacerators 0 477 718 2025-07-23T21:15:17Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Lacerators.png | Type = Dual Wield | Speed = Fast | Damage type = Sharp | Passives = Lacerate, Lifesteal | Mk2_Damage_min = 97 | Mk2_Damage_max = 108 | Mk5_Damage_min = 235 | Mk5_Damage_max = 261 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == {{Navbox/Weapons}} b1946670af3fe4f2bd09c0dfc86872b327a200a9 Nodachi 0 499 762 2025-07-23T21:15:34Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Nodachi.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Whirlwind, Tornado | Mk3_Damage_min = 315 | Mk3_Damage_max = 344 | Mk4_Damage_min = 368 | Mk4_Damage_max = 402 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Dropped by [[Nurgei the Blademaster]]. {{Navbox/Weapons}} 86417f91f727b87f778da76948fb454da2e92744 Royal Claymore 0 503 770 2025-07-23T21:15:53Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Royal Claymore.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Claymore Swing, Sword Strike | Mk3_Damage_min = 315 | Mk3_Damage_max = 344 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|-9938|7939|-1340}} Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item. {{Navbox/Weapons}} d8f571fe32e600c12e02d6d3d5e06dac9e5df229 Soul Reaper 0 500 764 2025-07-23T21:16:16Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Soul Reaper.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Reap, Soul Storm | Mk3_Damage_min = 322 | Mk3_Damage_max = 361 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|1413|-9293|190}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. When reaching the outdoors area, head up the stairs and go left. Climb up the cliff by repeatedly tapping the jump button. Once at the top, head forward and follow the path that leads downwards. Eventually you will reach a group of buildings. In front of one of these is the weapon. {{Navbox/Weapons}} 950b71e0fc9d4dbdefdb52a2c58ee43849dd7600 Twinblade 0 505 774 2025-07-23T21:16:32Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Twinblade.png | Type = Twinblade | Damage type = Sharp | Speed = Swift | Abilities = Blade Dance, Blade Flurry | Mk3_Damage_min = 75 | Mk3_Damage_max = 78 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Drops from [[enemies]] using the twinblade weapon. {{Navbox/Weapons}} f75786b2c8e5d234ef871b2f5c2e32b4924b1b6a Greater Anomalous Crystal 0 420 602 2025-07-23T21:45:55Z Sharparam 284703 Add Blok 6147 location and improve table wikitext text/x-wiki '''{{PAGENAME}}''' is an [[Items|item]] found in {{BFF}}. It can be embedded into [[weapons]] or [[armor]] to improve their properties. == Variants == There are several different variants of the crystal that all share the same name in-game, differing only by their visual appearance and the effects they give when embedded into [[equipment]]. They have received ad-hoc names on the wiki temporarily to be able to differentiate them. The names are assigned based on the item's appearance. === "Purple jagged" === * '''Effect in [[armor]]:''' +25 max [[flux]] points. * '''Effect in [[weapons]]:''' +8% [[technomancy]] penetration. === "Orange shield" === * '''Effect in [[armor]]:''' +30% base weapon damage. * '''Effect in [[weapons]]:''' +9% attack power. === "Ruby" === * '''Effect in [[armor]]:''' +75 max health points. * '''Effect in [[weapons]]:''' +15% critical damage. == Locations == {| class="wikitable sortable" ! scope="col" | Area ! scope="col" class="unsortable" | Description ! scope="col" class="unsortable" | Coordinates ! scope="col" | Variant |- | [[Blok 6147]] || For now, refer to a walkthrough video on Discord.[https://discord.com/channels/541778372997677056/1087019327712133140/1087020918221590608] || {{coords|-1155|-1340|2635}} || Orange shield |- | [[Deluge]] || Starting from the first [[homunculus]] in the area, climb the stairs (past [[The Handler]]) and enter the small tower inhabited by a [[Diver]] [[Enemies|enemy]]. Look over the edge and you'll see a rusty walkway circling the tower. Drop down onto the walkway and follow it to the right (the direction the enemy was facing) and keep following it to find a ladder going up. Climb the ladder and continue straight to notice a gap in the floor, jump the gap and continue forward to find the crystal. (Going down the gap leads to a post-process effect unlock ("Dramatic").) || {{coords|-3178|-1346|5700}} || Purple jagged |- | [[Uranopolis]] || Next to a tree near the giant enemy that drops [[Ring of Casting Speed]]. || {{coords|-2185|-4082|1473}} || Orange shield |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head up the big stairs and take the left path. At the end is a big cliff. Walk near the cliff and use the jump button repeatedly to climb to the top of the cliff. The item is on the edge of the cliff. || {{coords|1246|-8872|1517}} || Ruby |} {{Navbox/Items}} [[Category:Items]] [[Category:Anomalous crystals]] f3dbb5471d067f2759e3b9ef743f9c6ebc7f3619 Silent Streets 0 389 540 2025-07-23T22:01:44Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment tha..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment that has long forsaken any true sense of purpose or coherence. In this dreamlike, consuming city, their lives are a reflection of the city's own tragic state—a relentless cycle of existence without progress, forever trapped in the shadow of their own lost potential. }} == Location == {{coords|1244|1057|1956}} Found in [[Blok 6147]]. In an alley with a fire and nearby cargo box. It's in the area with multiple walkways at different heights with stairs between. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] d244a7077b0a0b4ba8290bdd23f999bdbf664d08 Statues 0 390 542 2025-07-23T22:13:13Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the city in a fixed, lifeless gaze. }} == Location == {{coords|1424|1365|3124}} Located in [[Blok 6147]] at the end of one of the walkways with stairs between them. [[File:Statues_location.jpg|thumb|left|Location of the data log.|alt=Screenshot showing the location of the data log.]] {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] afc40155102345cb921361ea566916b295ded7c5 Eris 0 495 754 2025-07-23T22:31:35Z Sharparam 284703 Created page with "{{Infobox/Armor | title = {{PAGENAME}} | image = Eris.png | Type = Helmet | Weight = Light | Passives = Flux Efficiency | Mk5_Sharp = 730 | Mk5_Blunt = 730 | Mk5_Technomancy = 939 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|2860|-4261|1423}} Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars. {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Eris.png | Type = Helmet | Weight = Light | Passives = Flux Efficiency | Mk5_Sharp = 730 | Mk5_Blunt = 730 | Mk5_Technomancy = 939 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|2860|-4261|1423}} Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars. {{Navbox/Armor}} 3716b6c0ca03c71f6dc10ebb3357cb49aa6862ef Template:Infobox/Armor 10 453 670 2025-07-23T22:34:12Z Sharparam 284703 Add support for passives wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helmet = [[Helmet]] | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard = [[Legguard]] | gauntlet = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{hlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> b1b6719714f0e3277010b8ca8d5ecb76f9538378 Template:Infobox/Armor/doc 10 454 672 2025-07-23T22:35:47Z Sharparam 284703 Update template data wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for armor", "params": { "image": { "label": "Armor image", "description": "Name of the file used as the image for the armor, should be at least 300 pixels wide.", "required": true, "example": "Cool armor.png", "type": "wiki-file-name" }, "Type": { "label": "Armor type", "description": "The type of armor.", "required": true, "example": "Helmet", "type": "wiki-page-name" }, "Weight": { "label": "Armor weight", "description": "The weight class of the armor.", "required": true, "example": "Light", "type": "string" }, "Set": { "label": "Armor set", "description": "Name of an armor set, if the piece is part of one.", "required": false, "example": "Cool set", "type": "wiki-page-name" }, "Passives": { "label": "Passive effects", "description": "Comma-separated list of passive effects", "required": false, "example": "Regen HP, Regen FX", "type": "string" }, "Mk1_Sharp": { "label": "Mk 1 sharp rating", "description": "Sharp defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Blunt": { "label": "Mk 1 blunt rating", "description": "Blunt defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Technomancy": { "label": "Mk 1 technomancy rating", "description": "Technomancy defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk2_Sharp": { "label": "Mk 2 sharp rating", "description": "Sharp defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Blunt": { "label": "Mk 2 blunt rating", "description": "Blunt defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Technomancy": { "label": "Mk 2 technomancy rating", "description": "Technomancy defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk3_Sharp": { "label": "Mk 3 sharp rating", "description": "Sharp defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Blunt": { "label": "Mk 3 blunt rating", "description": "Blunt defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Technomancy": { "label": "Mk 3 technomancy rating", "description": "Technomancy defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk4_Sharp": { "label": "Mk 4 sharp rating", "description": "Sharp defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Blunt": { "label": "Mk 4 blunt rating", "description": "Blunt defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Technomancy": { "label": "Mk 4 technomancy rating", "description": "Technomancy defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk5_Sharp": { "label": "Mk 5 sharp rating", "description": "Sharp defense rating at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Blunt": { "label": "Mk 5 blunt rating", "description": "Blunt defense rating at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Technomancy": { "label": "Mk 5 technomancy rating", "description": "Technomancy defense rating at Mk 5", "required": true, "example": "5", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Armor | image = Helmet 2-1 SVG.svg | title = Awesome helmet | Type = Helmet | Weight = Heavy | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} <syntaxhighlight lang="wikitext"> {{Infobox/Armor | image = Helmet 2-1 SVG.svg | title = Awesome helmet | Type = Helmet | Weight = Heavy | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} </syntaxhighlight> 03d97e9c6ffe6abdc853a4e886a5526e3ca4922d Taskmaster 0 510 784 2025-07-23T23:20:45Z Sharparam 284703 Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Taskmaster.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Rapid Fire, Critical Strike | Mk2_Damage_min = 240 | Mk2_Damage_max = 256 }} '''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}. == Location == {{coord|4052|1265|-1412}} Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and..." wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Taskmaster.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Rapid Fire, Critical Strike | Mk2_Damage_min = 240 | Mk2_Damage_max = 256 }} '''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}. == Location == {{coord|4052|1265|-1412}} Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches. {{Navbox/Weapons}} dd37cc2a86e75e6fa9d8f0c27f5bfcb3c3a09e92 Unknown Limits 0 391 544 2025-07-23T23:28:39Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its sur..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its surroundings, twisting them into bizarre, unrecognizable forms. }} == Location == {{coords|4984|1575|-1420}} Found in the [[Anomaly]]. When entering the area, it is the first thing you will come across as the cave opens up to the outdoors area. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 9c79704fa399a5c94c900c27d6cb8c39b760f58a Template:Navbox/Items 10 285 322 321 2025-07-23T23:32:16Z Sharparam 284703 Add link to essential items wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Essential items|Essential]] | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 7ddddd74185f43622c0032fb924e9ea4df3f2c1d Template:Navbox/Locations 10 293 377 2025-07-24T16:38:41Z Sharparam 284703 Created page with "<!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] * [[Blok 6147]] * [[Rain District]] * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] * [[Ghost Town]] * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude>" wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] * [[Blok 6147]] * [[Rain District]] * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] * [[Ghost Town]] * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> a9919f8122c30db35e45bc7830af1bd611295ec1 378 377 2025-07-24T17:10:37Z Sharparam 284703 Add links to sub-locations wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> 91e37bd11620abbf81329f4ac0f61b9337538af4 Monastery 0 354 470 2025-07-24T16:59:38Z Sharparam 284703 wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Lower == [[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]] {{Quote | A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings }} {{clear}} == Upper == [[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]] {{Quote | Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos. }} {{Navbox/Locations}} [[Category:Locations]] c45661f5fc6c65355deb9f8c90263eb72574a274 Uranopolis 0 352 466 2025-07-24T17:07:39Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Uranopolis''' is a location in {{BFF}}. == Sub-locations == Uranopolis consists of two sub-locations: Tower Complex and {{TODO}}. === Tower Complex === {{Main|Uranopolis/Tower Complex}} [[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]] The '''Tower Complex''' is the first sub-location encountered by the player. {{clear}} === Lone Tower === [[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]] The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here. {{Navbox/Locations}} [[Category:Locations]] fc3e22f798adfdd04bd6befa151ccc23aa80ecd5 Locations 0 351 464 2025-07-24T17:08:00Z Sharparam 284703 Created page with "{{Navbox/Locations}}" wikitext text/x-wiki {{Navbox/Locations}} 980e15253d6e4f1418e9efa737c209de74f57252 Blok 6147 0 353 468 2025-07-24T17:25:02Z Sharparam 284703 Add quote from relocation menu wikitext text/x-wiki [[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history. }} == Trivia == * If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list. {{Navbox/Locations}} [[Category:Locations]] bda6e533357582f201b31b2a208855d0bdc73471 Rain District 0 355 472 2025-07-24T17:29:27Z Sharparam 284703 Fix link typo wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Sewers == [[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]] {{Quote | A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures. }} {{clear}} == Center == [[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]] {{Quote | A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour }} {{Navbox/Locations}} [[Category:Locations]] 411486cc02e286f1982f8922cb1e84ebe86d13e4 Deluge 0 356 474 2025-07-24T17:32:11Z Sharparam 284703 Created page with "[[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} {{Navbox/Locations}} [[Category:Locations]]" wikitext text/x-wiki [[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} {{Navbox/Locations}} [[Category:Locations]] 693a79d49e7efc3474fef04a49a6ecfcf873ac1f Asylum 0 357 476 2025-07-24T17:35:03Z Sharparam 284703 Created page with "[[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} {{Navbox/Locations}} Category:Loca..." wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} {{Navbox/Locations}} [[Category:Locations]] 37e0b512f0b81e8f301b3b2858e9d4da7562c26f Upper Blocks 0 358 478 2025-07-24T17:37:37Z Sharparam 284703 Created page with "[[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind sti..." wikitext text/x-wiki [[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation. }} {{Navbox/Locations}} [[Category:Locations]] 8eb05dbbf1b2eca301ec7824369953ecf59627e8 Ghost Town 0 359 480 2025-07-24T17:41:48Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}} == Floor 1 == [[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]] {{Quote | A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog. }} {{Navbox/Locations}} [[Category:Locations]] de022882ea75493bf878521b5de2b72ab78ee421 Machinarium 0 360 482 2025-07-24T17:44:46Z Sharparam 284703 Created page with "[[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber cont..." wikitext text/x-wiki [[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay. }} {{Navbox/Locations}} [[Category:Locations]] bdce97e055f63d9b564bb8af98884bb9353ec5db Desert 0 361 484 2025-07-24T17:47:25Z Sharparam 284703 Created page with "[[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally br..." wikitext text/x-wiki [[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum. }} {{Navbox/Locations}} [[Category:Locations]] 7a4e1dcb94c588a7cbdfa9c4abb1a9303a8d2d79 Desert Mirage 0 362 486 2025-07-24T17:49:33Z Sharparam 284703 Created page with "[[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A desert from another time. }} {{Navbox/Locations}} [[Category:Locations]]" wikitext text/x-wiki [[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A desert from another time. }} {{Navbox/Locations}} [[Category:Locations]] b77e5799a2dcb88ca21171824a322e70e1ceed2f Anomaly (location) 0 363 488 2025-07-24T17:51:11Z Sharparam 284703 Created page with "[[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} {{Navbox/Locations}} [[Category:Locations]]" wikitext text/x-wiki [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} {{Navbox/Locations}} [[Category:Locations]] a8fc6f2bc209173c6c2c5d3d178232dfb1ed8321 Template:Navbox/Data logs 10 290 362 361 2025-07-24T19:24:27Z Sharparam 284703 Add [[The Grave Predicament]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[The Structure]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 82537fe78e3a074ce9313e77c8a0e10fbcd07289 363 362 2025-07-24T19:39:55Z Sharparam 284703 Add [[Kaleidoscope of Dreams]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> d27f6dedb12199ea9906176abf11a31e884cfb4e 364 363 2025-07-24T20:35:41Z Sharparam 284703 Add [[Vermillion]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 61fdff8b80c1427da5886fa5b73c6c586e088a1d 365 364 2025-07-25T00:26:24Z Sharparam 284703 Add [[A Broken Reality]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 1f8888031e5a5d1097cb7190e22eb472ab1ec16f 366 365 2025-07-26T16:46:43Z Sharparam 284703 Add [[Understanding]] wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[Understanding]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 09b921cd27b38e22701e9064c302db0e3c8d90f3 The Grave Predicament 0 392 546 2025-07-24T19:29:54Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are as elusive as [[Omnistructure|the Omnistructure]] itself, blending seamlessly into the very fabric of the mysterious domain it governs within it. Its presence, while influential, only adds to the overall complexity of [[Omnistructure|the Omnistructure]], reinforcing the idea that understanding this colossal construct may forever remain an elusive, if not an impossible, pursuit. Nevertheless we must try. Our very survival hinges on our ability to adapt, and without understanding at the very least our immediate surroundings in this labyrinth, we have no room to elude the ever-pursuing peril that surrounds us. }} == Location == {{coords|4404|1793|-1412}} Located on an edge overlooking the labyrinth in the [[Anomaly]] area, just after [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius']] boss arena. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 4a149e96e2d9c362546ae535afb986f4d6e1cb03 Blessed Crosier 0 508 780 2025-07-24T19:32:37Z Sharparam 284703 Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Blessed Crosier.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Escape Velocity, Energy Burst | Mk3_Damage_min = 173 | Mk3_Damage_max = 177 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. == Acquisition == Dropped by [[Archinquisitor Belisarius (boss)]]. {{Navbox/Weapons}}" wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Blessed Crosier.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Escape Velocity, Energy Burst | Mk3_Damage_min = 173 | Mk3_Damage_max = 177 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. == Acquisition == Dropped by [[Archinquisitor Belisarius (boss)]]. {{Navbox/Weapons}} d1d557ec6a9700fda1ee5579a6f5c4cf86cd912f Kaleidoscope of Dreams 0 393 548 2025-07-24T19:42:40Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches. }} == Loca..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches. }} == Location == {{coords|5310|2116|-1450}} Found in the [[Anomaly]] area, located right in front of the anomaly itself at the final part of the labyrinth. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] e9b3658c5073f52f9811e41c238dc70edd1b8e24 Template:Navbox/Locations 10 293 379 378 2025-07-24T19:50:02Z Sharparam 284703 Add [[Unknown]] wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> 707b7f5a5cdc0a7291104d9690755ad1acb0d8ea 380 379 2025-07-24T20:11:37Z Sharparam 284703 Add [[Vermillion Fields]] wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown]] * [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]]) }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> df2290162f33b6947a33876ca7a91148393a2506 381 380 2025-07-24T20:24:01Z Sharparam 284703 Fix link to Unknown wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown (location)|Unknown]] * [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]]) }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> fce3ea1b70826b4182d9c45e9139ae61473c389b 382 381 2025-07-25T00:58:26Z Sharparam 284703 Add Vermillion Fields Temple sub-location wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown (location)|Unknown]] * [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]] · [[Vermillion Fields#Temple|Temple]]) }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> 7716644faea4dd5aee763d21d89daca0de53c69c Unknown (location) 0 365 492 2025-07-24T20:21:48Z Sharparam 284703 Created page with "{{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}} '''Unknown''' is a [[Locations|location]] in {{BFF}}. == Overview == As the Unknown cannot be relocated to, it has no artwork image and no in-game description. {{Navbox/Locations}} [[Category:Locations]]" wikitext text/x-wiki {{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}} '''Unknown''' is a [[Locations|location]] in {{BFF}}. == Overview == As the Unknown cannot be relocated to, it has no artwork image and no in-game description. {{Navbox/Locations}} [[Category:Locations]] 351676f2dfc783d43a014b11a690031ea946e2b8 Unknown 0 366 494 2025-07-24T20:23:30Z Sharparam 284703 Fix missing paren wikitext text/x-wiki '''Unknown''' may refer to: == Common meanings == * [[Unknown (location)]], the location with the platforming puzzles leading to an optional boss. * [[Unknown (boss)]], the boss enemy that can be optionally fought in the location sharing its name. {{Disambiguation}} a972049d778c73207104b07ad235871c7a53466d Unknown (boss) 0 549 858 2025-07-24T20:25:53Z Sharparam 284703 Specify boss is optional wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}} {{Infobox/Boss | title = Unknown | image = Unknown (boss).png }} '''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat. Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]]. == Location == Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 08cbc1e8f1d754f6cc8e5e04d59cc388bc187d8f Archinquisitor Belisarius (boss) 0 548 856 2025-07-24T20:26:12Z Sharparam 284703 Fix name wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}} {{Infobox/Boss | title = Archinquisitor Belisarius | image = Archinquisitor Belisarius (boss).png }} '''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|4315|1734|-1413}} (approximate) Found at the beginning of the [[Anomaly]] area. == Drops == * [[Blessed Crosier]] * [[Unstable Perk Essence]] * [[Upgrade Module]] == Quotes == === Upon engaging him === {{Quote |Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now. Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for. The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance. Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend. Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will. Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs. }} {{Navbox/Bosses}} 73a24d629934b27f74f10c58c9ab9e02ed3858bc Vermillion 0 394 550 2025-07-24T20:47:54Z Sharparam 284703 Improve location description wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |An omnipresent presence bathed everything in a deep vermillion{{note|"Vermillion" here refers to the color, although it might be more commonly spelled as "vermilion" (with only one L).}} hue. This color created an overwhelming sense of order. The vermillion presence exuded a serene yet unsettling stillness, embodying an ideal form of tranquility. It seemed to impose a perfect structure on the disarray around it, its calm nature hiding an underlying menace. The more you focused on the vermillion form, the more it became clear that this serenity was a guise, concealing a power that could shatter the delicate balance at play. }} == Location == {{coords|483|-4883|1752}} Found in the [[Vermillion Fields]], on top of a balcony with a [[Vermillion Knight]] guarding it. Standing at the [[Homunculus]], face the direction of [[The Handler]] and the balcony can be seen behind her. == See also == * [[Vermillion Fields]], for the endgame location * [[Vermillion Knight]], for the enemy == Notes == {{notelist}} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 989e673b86ad80578a904518b93dcddaf305e173 A Broken Reality 0 395 552 2025-07-25T00:29:06Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present. }} == Location == {{coords|2368|-5079|1225}} Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present. }} == Location == {{coords|2368|-5079|1225}} Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk to where the blue lightsaber knight is. Head outside from there and get to the edge. Take a left and follow the edge until you come to a balcony on the right with the data log. Use [[Scanner|the scanner]] to help you find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] cb804aedc9c441989a2f08a03652278a42ce02a8 Vermillion Fields 0 364 490 2025-07-25T00:56:04Z Sharparam 284703 Add temple location wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Overview == Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]]. == Plaza == [[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]] {{Quote |Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field. }} {{clear}} == Temple == [[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]] {{Quote |Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes. }} {{Navbox/Locations}} [[Category:Locations]] 71f1f17927909020242b8cf472a7e2f89199d643 Template:Navbox/Weapons 10 438 636 2025-07-25T01:14:14Z Sharparam 284703 Add [[Valtiel]] wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] | group3 = [[Ranged weapons|Ranged]] | group3.1 = [[Longbows]] | list3.1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] | group3.2 = [[Staves]] | list3.2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude> 441db50a6ddfe17d473822864f9d20f3a2af385f Valtiel 0 504 772 2025-07-25T01:15:53Z Sharparam 284703 Created page with "{{Infobox/Weapon | title = {{PAGENAME}} | image = Valtiel.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Syphon Life, Carnage | Mk3_Damage_min = 522 | Mk3_Damage_max = 562 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Vermillion Knight|Vermillion Knights]]. {{Navbox/Weapons}}" wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Valtiel.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Syphon Life, Carnage | Mk3_Damage_min = 522 | Mk3_Damage_max = 562 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Vermillion Knight|Vermillion Knights]]. {{Navbox/Weapons}} cd2852971f9cc25db419ef806fb9c0960f845d16 Template:Navbox/Amulets 10 441 642 2025-07-25T03:48:01Z Sharparam 284703 Add [[Tactician's Amulet]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane Protection]] * [[Amulet of Evasion]] * [[Tactician's Amulet]] }} 52e610bdb0cd1e26a433d4a731efea2e044132e1 Tactician's Amulet 0 518 799 2025-07-25T03:49:52Z Sharparam 284703 Created page with "{{Infobox/Amulet | title = {{PAGENAME}} | image = Tactician's Amulet.png | Effects = Removes invincibility frames | Passives = Vulnerable Dodge }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. {{Navbox/Amulets}}" wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Tactician's Amulet.png | Effects = Removes invincibility frames | Passives = Vulnerable Dodge }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. {{Navbox/Amulets}} 8032681e4f4e42a1fa5445d736a503ae40145d42 Plagued Warden 0 545 850 2025-07-26T15:59:31Z Sharparam 284703 Add note on spawning wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Plagued Warden.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|2395|-2410|529}} (approximate) Located in [[Blok 6147]]. After getting off the [[subway]], take the path leading up and then take the stairs on the left. You will see a platform nearby with a spiked shield on the far end. Interacting with the shield spawns the boss, but doing so requires having the [[Plagued Blood]] item in your inventory. == Drops == * [[Spiked Shield]] (only in NG (or if you don't yet have it?)) * [[Anomalous Fragment]] (only in [[NG+]] (or if you don't have the shield?)) {{Navbox/Bosses}} 5dfd44f48ae568136e010129ccbd00bbd7c71a55 Plagued Blood 0 422 606 2025-07-26T16:00:18Z Sharparam 284703 Add usage wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Plagued Blood.png | Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant. }} == Location == {{coords|-3898|1671|1585}} Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table. == Usage == Having this item in your inventory allows for spawning some optional bosses. * [[Plagued Warden]] * [[Plagued Revenant]] {{Navbox/Items}} [[Category:Essential items]] 1f8d91aaf3bd07906a2a403a6db0b8ae9ee60325 Understanding 0 396 554 2025-07-26T16:46:12Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment }} == A..." wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment }} == Acquisition == Unlocked upon speaking to [[Inquisitor Commander Alexius]] for the first time. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 58629768126fce5c895113d20c5c3433807829d2 Template:Navbox/Rings 10 292 375 374 2025-07-26T16:49:00Z Sharparam 284703 Add [[Ring of Hawk]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Hawk]] * [[Ring of Rammstein]] * [[Ring of Lesser Talent]] * [[Ring of Talent]] * [[Ring of Exceeding Talent]] }}<noinclude>[[Category:Navigation templates]]</noinclude> a26fb4e5bb5097e037bde34bbe50c7f6f0fd3453 Plagued Nemesis 0 542 844 2025-07-26T16:59:34Z Sharparam 284703 Add drop wikitext text/x-wiki {{Infobox/Boss | image = Plagued Nemesis.png | SharpResist = 32 | BluntResist = 2 | TechnomancyResist = 50 }} '''{{PAGENAME}}''' is an optional [[boss]] [[Enemies|enemy]] in {{BFF}}. == Location == Found at the top of the big tower in [[Asylum|the asylum]]. == Drops == * [[Khopeshs]] * [[Unstable Perk Essence]] * [[Upgrade Module]] * [[Anomalous Fragment]] (Only in [[NG+]]) {{Navbox/Bosses}} 3ab22950bbea5ef8c5c7eecf9db701cacb0006a0 Anomalous Fragment 0 426 614 2025-07-26T17:52:32Z Sharparam 284703 Update acquisition wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Anomalous Fragment.png | Description = [[The Handler|Handler]] may convert it to a more useful form. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Acquisition == Drops from [[bosses]] in [[NG+]]. == Usage == Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]]. [[Category:Essential items]] 7980e000ddcb82018f50487ce22ffa9df9abbde2 Nurgei the Blademaster 0 544 848 2025-07-26T17:52:58Z Sharparam 284703 Add drop wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Nurgei the Blademaster.png | SharpResist = 29 | BluntResist = 37 | TechnomancyResist = 57 }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|1138|-9288|1571}} (approximate) Found in [[Uranopolis#Lone Tower|Uranopolis (Lone Tower)]]. From the [[Homunculus]], walk across the long bridge lined with pillars and you will see him straight ahead in his boss arena. == Drops == * [[Upgrade Module]] * [[Nodachi]] * [[Unstable Perk Essence]] * [[Anomalous Fragment]] ([[NG+]]) {{Navbox/Bosses}} 1f8634a99af6d189e90d0e6283c284736ffbd4fe Old Key 0 429 620 2025-07-26T18:04:43Z Sharparam 284703 Created page with "{{Infobox/Item | title = {{PAGENAME}} | image = Old Key.png | Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]]. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Location == {{coords|19328.57|-41596.65|3.83}} Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up. == Usage == Unlocks the gate at the top of the [[Monastery]], found near t..." wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Old Key.png | Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]]. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Location == {{coords|19328.57|-41596.65|3.83}} Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up. == Usage == Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it). {{Navbox/Items}} a6c6a09cf952e26c4386195a47267f9112b2ac5e Konrad the Traitor 0 550 860 2025-07-26T18:04:55Z Sharparam 284703 Created page with "{{Infobox/Boss | title = {{PAGENAME}} | image = Konrad the Traitor.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]). == Location == {{coords|18794.39|-40662.96|-15.20}} (approximate) Located at the top of the [..." wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Konrad the Traitor.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]). == Location == {{coords|18794.39|-40662.96|-15.20}} (approximate) Located at the top of the [[Monastery]], being the area's boss. == Drops == * [[Homunculus Mirage Husk]] * [[Handler Echo]] * [[Anomalous Fragment]] ([[NG+]]) {{Navbox/Bosses}} acd47fd792b54614f8d3d42a80fe9037a65997cc Handler Echo 0 421 604 2025-07-26T18:05:14Z Sharparam 284703 Add konrad drop wikitext text/x-wiki {{Infobox/Item | image = Handler Echo.png | title = {{PAGENAME}} | Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to. == Usage == If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level. == Acquisition == * Drops from [[Konrad the Traitor]]. * Can drop from samurai enemies in [[Uranopolis]] (limited to one drop). == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}} |- | [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}} |- | [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}} |} {{Navbox/Items}} [[Category:Essential items]] 8e39742af7d396a0340cfbf20893f0518504a05a Kamas 0 476 716 2025-07-26T18:41:15Z Sharparam 284703 Add damage for Mk 4 and 5 wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Kamas.png | Type = Dual Wield | Speed = Swift | Damage type = Sharp | Passives = Powerful Decay | Abilities = Bladestorm | Mk3_Damage_min = 112 | Mk3_Damage_max = 130 | Mk4_Damage_min = 269 | Mk4_Damage_max = 313 | Mk5_Damage_min = 308 | Mk5_Damage_max = 358 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == {{Navbox/Weapons}} 80fd6cf0dc6a59c85d7b761b05ed0b0cb9908c27 Daggers 0 478 720 2025-07-26T21:54:12Z Sharparam 284703 Add min mark wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Daggers.png | Type = Dual Wield | Speed = Swift | Damage type = Sharp | Abilities = Dual Brutality, Shadowstep | Mk_min = 2 | Mk2_Damage_min = 106 | Mk2_Damage_max = 123 | Mk3_Damage_min = 135 | Mk3_Damage_max = 157 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Location == Located together with the [[sentinel]] [[Armor sets|armor set]] on a corpse in [[Asylum|the asylum]]. See [[Sentinel#Location]] for its location. {{Navbox/Weapons}} 564b414d6a096a1107d0569379379434b1e1f48e Template:Plainlist 10 535 830 2025-07-26T22:45:29Z Sharparam 284703 Created page with "<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude>" wikitext text/x-wiki <templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude> 1f83cec6d8a2e5ba45342d554089a71b19afae80 Template:Plainlist/styles.css 10 536 832 2025-07-26T22:45:54Z Sharparam 284703 sanitized-css text/css .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 15a09febff47c3fa7ff01092a7cd381b44a14427 Template:Infobox/Weapon/doc 10 452 668 2025-07-27T03:00:01Z Sharparam 284703 Add template data for mk 0 wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for weapons", "params": { "title": { "label": "Weapon name", "description": "The name of the weapon", "required": false, "default": "{{PAGENAME}}", "example": "Cool Sword", "type": "string" }, "image": { "label": "Weapon image", "description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.", "required": true, "example": "Cool weapon.png", "type": "wiki-file-name" }, "Type": { "label": "Weapon type", "description": "The type of the weapon.", "required": true, "example": "Dual Wields", "type": "wiki-page-name" }, "Speed": { "label": "Weapon speed", "description": "The speed category of the weapon.", "required": true, "example": "Fast", "type": "string" }, "Damage type": { "label": "Weapon damage type", "description": "The type of damage dealt by the weapon.", "required": true, "example": "Sharp", "type": "wiki-page-name" }, "Passives": { "label": "Passive properties", "description": "Any passive properties the weapon has, comma separated", "required": false, "example": "Health Regen, Flux Regen", "type": "string" }, "Abilities": { "label": "Active abilities", "description": "Active abilities that can be used when the weapon is equipped, comma separated", "required": false, "example": "Blade Dance", "type": "string" }, "Mk_min": { "label": "Minimum mark level", "description": "The initial mark level of the weapon", "required": false, "default": "0", "example": "3", "type": "number" }, "Mk0_Damage_min": { "label": "Min. damage at Mk. 0", "description": "Minimum damage the weapon deals at Mk. 0", "required": true, "example": "5", "type": "number" }, "Mk0_Damage_max": { "label": "Max. damage at Mk. 0", "description": "Maximum damage the weapon deals at Mk. 0", "required": true, "example": "8", "type": "number" }, "Mk1_Damage_min": { "label": "Min. damage at Mk. 1", "description": "Minimum damage the weapon deals at Mk. 1", "required": true, "example": "5", "type": "number" }, "Mk1_Damage_max": { "label": "Max. damage at Mk. 1", "description": "Maximum damage the weapon deals at Mk. 1", "required": true, "example": "8", "type": "number" }, "Mk2_Damage_min": { "label": "Min. damage at Mk. 2", "description": "Minimum damage the weapon deals at Mk. 2", "required": true, "example": "10", "type": "number" }, "Mk2_Damage_max": { "label": "Max. damage at Mk. 2", "description": "Maximum damage the weapon deals at Mk. 2", "required": true, "example": "15", "type": "number" }, "Mk3_Damage_min": { "label": "Min. damage at Mk. 3", "description": "Minimum damage the weapon deals at Mk. 3", "required": true, "example": "20", "type": "number" }, "Mk3_Damage_max": { "label": "Max. damage at Mk. 3", "description": "Maximum damage the weapon deals at Mk. 3", "required": true, "example": "25", "type": "number" }, "Mk4_Damage_min": { "label": "Min. damage at Mk. 4", "description": "Minimum damage the weapon deals at Mk. 4", "required": true, "example": "30", "type": "number" }, "Mk4_Damage_max": { "label": "Max. damage at Mk. 4", "description": "Maximum damage the weapon deals at Mk. 4", "required": true, "example": "40", "type": "number" }, "Mk5_Damage_min": { "label": "Min. damage at Mk. 5", "description": "Minimum damage the weapon deals at Mk. 5", "required": true, "example": "50", "type": "number" }, "Mk5_Damage_max": { "label": "Max. damage at Mk. 5", "description": "Maximum damage the weapon deals at Mk. 5", "required": true, "example": "60", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Weapon | title = Cool Sword | image = Sword_01.svg | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen,Stuff,Cool | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Weapon | title = Cool Sword | image = Sword_01.svg | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} </syntaxhighlight> 03d55ce17e93a95147326d083a21a60c735a4602 NPCs 0 368 498 2025-07-27T19:31:51Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Non-player characters (NPC)''' are characters in {{BFF}} that can aid the player, provide services, or be spoken to in order to learn more about the world. == Notable NPCs == * [[The Handler]] &ndash; Upgrades [[equipment]] and allows for [[crafting]] certain [[items]]. {{Navbox/NPCs}} 79553771fc8e6ca775b99979d35e2de32ae39cbb Template:Navbox/NPCs 10 294 384 2025-07-27T19:37:46Z Sharparam 284703 Created page with "{{Navbox | {{{child|}}} | template = Navbox/NPCs | title = [[NPCs]] | list1 = * [[Abandoned Soldier]] * [[Abelard the Brave]] * [[Anselm the Pure]] * [[Archinquisitor Belisarius]] * [[The Handler]] * [[Inquisitor Commander Alexius]] * [[Mysterious Woman]] * [[Royal Division Captain Yulia]] * [[Stranger]] * [[Yaroslav]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] <noinclude>" wikitext text/x-wiki {{Navbox | {{{child|}}} | template = Navbox/NPCs | title = [[NPCs]] | list1 = * [[Abandoned Soldier]] * [[Abelard the Brave]] * [[Anselm the Pure]] * [[Archinquisitor Belisarius]] * [[The Handler]] * [[Inquisitor Commander Alexius]] * [[Mysterious Woman]] * [[Royal Division Captain Yulia]] * [[Stranger]] * [[Yaroslav]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] <noinclude> 19819092a7dffc936dc5330f6d3c7764bede86db Abandoned Soldier 0 400 561 2025-07-27T22:35:50Z Sharparam 284703 Add infobox and navbox wikitext text/x-wiki {{Infobox/NPC | image = Abandoned Soldier.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == Found in the [[Monastery#Lower|lower Monastery]], at the top of the stairs sitting next to one of the statue heads ({{coords|22476.39|-66438.91|-8856.44}}). After defeating [[Konrad the Traitor]], he moves to {{TODO|Add second location}}. At some point, he disappears entirely from the game. {{Navbox/NPCs}} e596f1f08e1e0d7bb6ddf38f363f5924a5b8dd01 Archinquisitor Belisarius 0 401 563 2025-07-27T22:36:32Z Sharparam 284703 Add infobox and navbox wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}} {{stub}} {{Infobox/NPC | image = Archinquisitor Belisarius.png }} {{Navbox/NPCs}} 7acff4eb5df9236854d4caf127e0613b0980b80d Inquisitor Commander Alexius 0 402 565 2025-07-27T22:37:16Z Sharparam 284703 Add infobox and navbox wikitext text/x-wiki {{Infobox/NPC | image = Inquisitor Commander Alexius.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|-41635.32|9075.12|11831.71}} Located in the [[Asylum]], in a tower that can be reached by following a hidden path. == Quotes == === On first meeting === {{Quote |Hmmm – a visitor. A visitor to a plague at that – a rare occurence{{sic|expected=occurrence}}. Ah! The Administration? Yes – that much is now obvious. Always a pervasive need for the world to make sense – but with each passing moment, I find the [[omnistructure]] is always one step beyond it… beyond comprehension. I wonder what tales you'd share if only you could speak. Traversing every crevice and ruin on foot, my, my… the secrets you hold… and what happens to the ones you leave behind? Do you ever think of them? It sounds like a treacherous life… You must not know much kindness. And how could you – I imagine you've experienced pain and death uncountable times. It is after all reflected in your demeanour. Maybe this can make a small change. <!-- Gives greater crystals --> You know, I myself am not a stranger to challenges. This struggle between absolute power and perfect order is no longer easy to balance. I find myself giving it my all, without, seeing much in return… [[The Serdars]] now complicate things… Their sacrifices were too great for a wavering Empire. Yet rebelling against everything makes life lose its purpose… [[The Administration|The Administration's]] vision of order is sterile however… perfect, yes, but like marble – its beauty frozen permanently in the rhythm of death. In his few moments of peace, [[Yaroslav]] would probably explain it better than I – then again – his word was always as sharp as his saber. We both have work to do. Until we meet again. }} Unlocks the data log [[Understanding]] and gives you two [[Greater Anomalous Crystal|Greater Anomalous Crystals]]. === After first encounter === {{Quote|We both have work to do. Until we meet again}} {{Navbox/NPCs}} 39b57600330ffb5ca7e6c437458be303142ceb91 Yaroslav 0 403 567 2025-07-27T22:38:09Z Sharparam 284703 Add infobox and navbox wikitext text/x-wiki {{Infobox/NPC | image = Yaroslav.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3721|1150|-1397}} Located in the [[Desert]]. Standing with his crew in front of the gate to [[The Anomaly]]. == Quotes == === First encounter === {{Quote |Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing. Time is not of the essence here… Only choice. Soon, you'll feel it yourself. Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face… Beyond those gates, you will have to carry the greatest burden of all – your own! The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness! I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her. I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life. We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception… When you return, Collector, things will not be as they were. You will not be as you were. }} === After first encounter === {{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}} === Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] === {{Quote |Things have been set in motion that can never be explained. An eternal rain is coming our way – remember to trust your blade. You will need it more than ever. }} {{Navbox/NPCs}} 6bb0d94919bf2b14a91b7fd37736740fa5038de0 Royal Division Captain Yulia 0 404 569 2025-07-29T12:44:45Z Sharparam 284703 Created page with "{{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia.png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. {{Navbox/NPCs}}" wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia.png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. {{Navbox/NPCs}} 47c5320bb535502d6ea086d13c44e3827509697f Vermillion Staff 0 507 778 2025-07-29T20:05:02Z Sharparam 284703 Specify minimum mark wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Vermillion Staff.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Forceful Repulsion, Quake | Mk_min = 3 | Mk3_Damage_min = 117 | Mk3_Damage_max = 120 }} '''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}. == Location == {{coords|1241|-8256|275}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. At the outdoor area with a big staircase leading up, head instead to the right before the staircase, leading to an area with some tombstones. The weapon can be found leaning against a wall in the dead-end. {{Navbox/Weapons}} e59fb090f56eced502c56a092f5d2cf9267c2818 Template:DamageRange 10 527 814 2025-07-29T20:07:04Z Sharparam 284703 Allow using tech as short for technomancy wikitext text/x-wiki <includeonly>{{Tooltip|{{{1}}}&ndash;{{{2}}}|Average: {{Average|{{{1}}}|{{{2}}}}}}}{{#if:{{{type|}}}|&nbsp;{{#switch:{{lc:{{{type}}}}} | sharp = [[Sharp]] | blunt = [[Blunt]] | tech | technomancy = [[Technomancy]] | #default = {{{type}}} }}|}}</includeonly><noinclude>{{Documentation}}</noinclude> bee05e8ca021e7585fc203ed68db91f82ab057e2 Template:Navbox/Armor 10 439 638 2025-07-29T20:28:04Z Sharparam 284703 Add [[Desert Corp]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Crude Helmet]] * [[Deserts Respirator Helmet]] * [[Eris]] * [[Librarian Hood]] * [[Plagued Revenant Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Techpriest Helmet]] | group2 = [[Pauldrons]] | group3 = [[Chestguards]] | list3 = * [[Citadel Warrior Chest]] * [[Corrupted Cuirass]] * [[Librarian Overcoat]] * [[Sentinel Chest]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>{{Documentation}}</noinclude> d47fdce5305e2ded83cd423d5b2674c32d0dde4d Mutated Ghoul 0 552 864 2025-07-30T21:47:33Z Sharparam 284703 Created page with "{{Infobox/Boss | image = Mutated Ghoul.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Location == {{coords|6937.36|-64861.39|-17736.47}} (approximate) Located in a big grass field at the bottom of the [[Monastery]]. == Drops == * [[Anomalous Fragment]] (only in [[NG+]]) {{Navbox/Bosses}}" wikitext text/x-wiki {{Infobox/Boss | image = Mutated Ghoul.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Location == {{coords|6937.36|-64861.39|-17736.47}} (approximate) Located in a big grass field at the bottom of the [[Monastery]]. == Drops == * [[Anomalous Fragment]] (only in [[NG+]]) {{Navbox/Bosses}} 8e88bd012af5d51d364d79af5fc33127dd67fa4d Divine Greataxe 0 470 704 2025-07-30T23:09:34Z Sharparam 284703 Fix coordinates wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Divine Greataxe.png | Type = Greatweapon | Damage type = Sharp | Speed = Sluggish | Passives = Greater Divine Judgment | Abilities = Regal Radiance | Mk4_Damage_min = 597 | Mk4_Damage_max = 656 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. == Location == {{coords|43210.37|165132.67|-141105.39}} Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building. {{Navbox/Weapons}} 0ae771a14e6b5fd5c63e8a73b5aebd90154e8bff Abelard the Brave 0 405 571 2025-07-30T23:23:05Z Sharparam 284703 Created page with "{{Infobox/NPC | image = Abelard the Brave.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3566.32|32790.88|-14128.63}} Stands on the edge of a platform at the top of the [[Machinarium]]. == Quotes == === First encounter === {{Quote |Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me… Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss! [[Serdar]] filth! No order to this place. Ther..." wikitext text/x-wiki {{Infobox/NPC | image = Abelard the Brave.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3566.32|32790.88|-14128.63}} Stands on the edge of a platform at the top of the [[Machinarium]]. == Quotes == === First encounter === {{Quote |Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me… Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss! [[Serdar]] filth! No order to this place. There's no cycle, no ebb and flow to the city. It all feels like… Eh. What do you care anyway. War is Hell. Not a sewer, so I don't exactly know what you{{note|The voice actor emphasis the "you" in this sentence, but the subtitles do not.}} are doing here. We all have our role to play. You play yours. We'll see about mine! Farewell. }} === Upon speaking to him again === {{Quote|Farewell.}} == Notes == {{notelist}} {{Navbox/NPCs}} bff64714017d7cf963314a972d069174724842aa Module:Convert 828 720 1103 2025-07-31T20:50:48Z wikipedia>Ahecht 0 move arg extraction to its own function to allow _convert() to be called from other lua modules Scribunto text/plain -- Convert a value from one unit of measurement to another. -- Example: {{convert|123|lb|kg}} --> 123 pounds (56 kg) -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. local MINUS = '−' -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92) local abs = math.abs local floor = math.floor local format = string.format local log10 = math.log10 local ustring = mw.ustring local ulen = ustring.len local usub = ustring.sub -- Configuration options to keep magic values in one location. -- Conversion data and message text are defined in separate modules. local config, maxsigfig local numdot -- must be '.' or ',' or a character which works in a regex local numsep, numsep_remove, numsep_remove2 local data_code, all_units local text_code local varname -- can be a code to use variable names that depend on value local from_en_table -- to translate an output string of en digits to local language local to_en_table -- to translate an input string of digits in local language to en -- Use translation_table in convert/text to change the following. local en_default -- true uses lang=en unless convert has lang=local or local digits local group_method = 3 -- code for how many digits are in a group local per_word = 'per' -- for units like "liters per kilometer" local plural_suffix = 's' -- only other useful value is probably '' to disable plural unit names local omitsep -- true to omit separator before local symbol/name -- All units should be defined in the data module. However, to cater for quick changes -- and experiments, any unknown unit is looked up in an extra data module, if it exists. -- That module would be transcluded in only a small number of pages, so there should be -- little server overhead from making changes, and changes should propagate quickly. local extra_module -- name of module with extra units local extra_units -- nil or table of extra units from extra_module -- Some options in the invoking template can set variables used later in the module. local currency_text -- for a user-defined currency symbol: {{convert|12|$/ha|$=€}} (euro replaces dollar) local function from_en(text) -- Input is a string representing a number in en digits with '.' decimal mark, -- without digit grouping (which is done just after calling this). -- Return the translation of the string with numdot and digits in local language. if numdot ~= '.' then text = text:gsub('%.', numdot) end if from_en_table then text = text:gsub('%d', from_en_table) end return text end local function to_en(text) -- Input is a string representing a number in the local language with -- an optional numdot decimal mark and numsep digit grouping. -- Return the translation of the string with '.' mark and en digits, -- and no separators (they have to be removed here to handle cases like -- numsep = '.' and numdot = ',' with input "1.234.567,8"). if to_en_table then text = ustring.gsub(text, '%d', to_en_table) end if numsep_remove then text = text:gsub(numsep_remove, '') end if numsep_remove2 then text = text:gsub(numsep_remove2, '') end if numdot ~= '.' then text = text:gsub(numdot, '.') end return text end local function decimal_mark(text) -- Return ',' if text probably is using comma for decimal mark, or has no decimal mark. -- Return '.' if text probably is using dot for decimal mark. -- Otherwise return nothing (decimal mark not known). if not text:find('[.,]') then return ',' end text = text:gsub('^%-', ''):gsub('%+%d+/%d+$', ''):gsub('[Ee]%-?%d+$', '') local decimal = text:match('^0?([.,])%d+$') or text:match('%d([.,])%d?%d?$') or text:match('%d([.,])%d%d%d%d+$') if decimal then return decimal end if text:match('%.%d+%.') then return ',' end if text:match('%,%d+,') then return '.' end end local add_warning, with_separator -- forward declarations local function to_en_with_check(text, parms) -- Version of to_en() for a wiki using numdot = ',' and numsep = '.' to check -- text (an input number as a string) which might have been copied from enwiki. -- For example, in '1.234' the '.' could be a decimal mark or a group separator. -- From viwiki. if to_en_table then text = ustring.gsub(text, '%d', to_en_table) end if decimal_mark(text) == '.' then local original = text text = text:gsub(',', '') -- for example, interpret "1,234.5" as an enwiki value if parms then add_warning(parms, 0, 'cvt_enwiki_num', original, with_separator({}, text)) end else if numsep_remove then text = text:gsub(numsep_remove, '') end if numsep_remove2 then text = text:gsub(numsep_remove2, '') end if numdot ~= '.' then text = text:gsub(numdot, '.') end end return text end local function omit_separator(id) -- Return true if there should be no separator before id (a unit symbol or name). -- For zhwiki, there should be no separator if id uses local characters. -- The following kludge should be a sufficient test. if omitsep then if id:sub(1, 2) == '-{' then -- for "-{...}-" content language variant return true end if id:byte() > 127 then local first = usub(id, 1, 1) if first ~= 'Å' and first ~= '°' and first ~= 'µ' then return true end end end return id:sub(1, 1) == '/' -- no separator before units like "/ha" end local spell_module -- name of module that can spell numbers local speller -- function from that module to handle spelling (set if needed) local wikidata_module, wikidata_data_module -- names of Wikidata modules local wikidata_code, wikidata_data -- exported tables from those modules (set if needed) local function set_config(args) -- Set configuration options from template #invoke or defaults. config = args maxsigfig = config.maxsigfig or 14 -- maximum number of significant figures local data_module, text_module local sandbox = config.sandbox and ('/' .. config.sandbox) or '' data_module = "Module:Convert/data" .. sandbox text_module = "Module:Convert/text" .. sandbox extra_module = "Module:Convert/extra" .. sandbox wikidata_module = "Module:Convert/wikidata" .. sandbox wikidata_data_module = "Module:Convert/wikidata/data" .. sandbox spell_module = "Module:ConvertNumeric" data_code = mw.loadData(data_module) text_code = mw.loadData(text_module) all_units = data_code.all_units local translation = text_code.translation_table if translation then numdot = translation.numdot numsep = translation.numsep if numdot == ',' and numsep == '.' then if text_code.all_messages.cvt_enwiki_num then to_en = to_en_with_check end end if translation.group then group_method = translation.group end if translation.per_word then per_word = translation.per_word end if translation.plural_suffix then plural_suffix = translation.plural_suffix end varname = translation.varname from_en_table = translation.from_en local use_workaround = true if use_workaround then -- 2013-07-05 workaround bug by making a copy of the required table. -- mw.ustring.gsub fails with a table (to_en_table) as the replacement, -- if the table is accessed via mw.loadData. local source = translation.to_en if source then to_en_table = {} for k, v in pairs(source) do to_en_table[k] = v end end else to_en_table = translation.to_en end if translation.lang == 'en default' then en_default = true -- for hiwiki end omitsep = translation.omitsep -- for zhwiki end numdot = config.numdot or numdot or '.' -- decimal mark before fractional digits numsep = config.numsep or numsep or ',' -- group separator for numbers -- numsep should be ',' or '.' or '' or '&nbsp;' or a Unicode character. -- numsep_remove must work in a regex to identify separators to be removed. if numsep ~= '' then numsep_remove = (numsep == '.') and '%.' or numsep end if numsep ~= ',' and numdot ~= ',' then numsep_remove2 = ',' -- so numbers copied from enwiki will work end end local function collection() -- Return a table to hold items. return { n = 0, add = function (self, item) self.n = self.n + 1 self[self.n] = item end, } end local function divide(numerator, denominator) -- Return integers quotient, remainder resulting from dividing the two -- given numbers, which should be unsigned integers. local quotient, remainder = floor(numerator / denominator), numerator % denominator if not (0 <= remainder and remainder < denominator) then -- Floating point limits may need this, as in {{convert|160.02|Ym|ydftin}}. remainder = 0 end return quotient, remainder end local function split(text, delimiter) -- Return a numbered table with fields from splitting text. -- The delimiter is used in a regex without escaping (for example, '.' would fail). -- Each field has any leading/trailing whitespace removed. local t = {} text = text .. delimiter -- to get last item for item in text:gmatch('%s*(.-)%s*' .. delimiter) do table.insert(t, item) end return t end local function strip(text) -- If text is a string, return its content with no leading/trailing -- whitespace. Otherwise return nil (a nil argument gives a nil result). if type(text) == 'string' then return text:match("^%s*(.-)%s*$") end end local function table_len(t) -- Return length (<100) of a numbered table to replace #t which is -- documented to not work if t is accessed via mw.loadData(). for i = 1, 100 do if t[i] == nil then return i - 1 end end end local function wanted_category(catkey, catsort, want_warning) -- Return message category if it is wanted in current namespace, -- otherwise return ''. local cat local title = mw.title.getCurrentTitle() if title then local nsdefault = '0' -- default namespace: '0' = article; '0,10' = article and template local namespace = title.namespace for _, v in ipairs(split(config.nscat or nsdefault, ',')) do if namespace == tonumber(v) then cat = text_code.all_categories[want_warning and 'warning' or catkey] if catsort and catsort ~= '' and cat:sub(-2) == ']]' then cat = cat:sub(1, -3) .. '|' .. mw.text.nowiki(usub(catsort, 1, 20)) .. ']]' end break end end end return cat or '' end local function message(parms, mcode, is_warning) -- Return wikitext for an error message, including category if specified -- for the message type. -- mcode = numbered table specifying the message: -- mcode[1] = 'cvt_xxx' (string used as a key to get message info) -- mcode[2] = 'parm1' (string to replace '$1' if any in message) -- mcode[3] = 'parm2' (string to replace '$2' if any in message) -- mcode[4] = 'parm3' (string to replace '$3' if any in message) local msg if type(mcode) == 'table' then if mcode[1] == 'cvt_no_output' then -- Some errors should cause convert to output an empty string, -- for example, for an optional field in an infobox. return '' end msg = text_code.all_messages[mcode[1]] end parms.have_problem = true local function subparm(fmt, ...) local rep = {} for i, v in ipairs({...}) do rep['$' .. i] = v end return (fmt:gsub('$%d+', rep)) end if msg then local parts = {} local regex, replace = msg.regex, msg.replace for i = 1, 3 do local limit = 40 local s = mcode[i + 1] if s then if regex and replace then s = s:gsub(regex, replace) limit = nil -- allow long "should be" messages end -- Escape user input so it does not break the message. -- To avoid tags (like {{convert|1<math>23</math>|m}}) breaking -- the mouseover title, any strip marker starting with char(127) is -- replaced with '...' (text not needing i18n). local append local pos = s:find(string.char(127), 1, true) if pos then append = '...' s = s:sub(1, pos - 1) end if limit and ulen(s) > limit then s = usub(s, 1, limit) append = '...' end s = mw.text.nowiki(s) .. (append or '') else s = '?' end parts['$' .. i] = s end local function ispreview() -- Return true if a prominent message should be shown. if parms.test == 'preview' or parms.test == 'nopreview' then -- For testing, can preview a real message or simulate a preview -- when running automated tests. return parms.test == 'preview' end local success, revid = pcall(function () return (parms.frame):preprocess('{{REVISIONID}}') end) return success and (revid == '') end local want_warning = is_warning and not config.warnings and -- show unobtrusive warnings if config.warnings not configured not msg.nowarn -- but use msg settings, not standard warning, if specified local title = string.gsub(msg[1] or 'Missing message', '$%d+', parts) local text = want_warning and '*' or msg[2] or 'Missing message' local cat = wanted_category(msg[3], mcode[2], want_warning) local anchor = msg[4] or '' local fmtkey = ispreview() and 'cvt_format_preview' or (want_warning and 'cvt_format2' or msg.format or 'cvt_format') local fmt = text_code.all_messages[fmtkey] or 'convert: bug' return subparm(fmt, title:gsub('"', '&quot;'), text, cat, anchor) end return 'Convert internal error: unknown message' end function add_warning(parms, level, key, text1, text2) -- for forward declaration above -- If enabled, add a warning that will be displayed after the convert result. -- A higher level is more verbose: more kinds of warnings are displayed. -- To reduce output noise, only the first warning is displayed. if level <= (tonumber(config.warnings) or 1) then if parms.warnings == nil then parms.warnings = message(parms, { key, text1, text2 }, true) end end end local function spell_number(parms, inout, number, numerator, denominator) -- Return result of spelling (number, numerator, denominator), or -- return nil if spelling is not available or not supported for given text. -- Examples (each value must be a string or nil): -- number numerator denominator output -- ------ --------- ----------- ------------------- -- "1.23" nil nil one point two three -- "1" "2" "3" one and two thirds -- nil "2" "3" two thirds if not speller then local function get_speller(module) return require(module).spell_number end local success success, speller = pcall(get_speller, spell_module) if not success or type(speller) ~= 'function' then add_warning(parms, 1, 'cvt_no_spell', 'spell') return nil end end local case if parms.spell_upper == inout then case = true parms.spell_upper = nil -- only uppercase first word in a multiple unit end local sp = not parms.opt_sp_us local adj = parms.opt_adjectival return speller(number, numerator, denominator, case, sp, adj) end ------------------------------------------------------------------------ -- BEGIN: Code required only for built-in units. -- LATER: If need much more code, move to another module to simplify this module. local function speed_of_sound(altitude) -- This is for the Mach built-in unit of speed. -- Return speed of sound in metres per second at given altitude in feet. -- If no altitude given, use default (zero altitude = sea level). -- Table gives speed of sound in miles per hour at various altitudes: -- altitude = -17,499 to 402,499 feet -- mach_table[a + 4] = s where -- a = (altitude / 5000) rounded to nearest integer (-3 to 80) -- s = speed of sound (mph) at that altitude -- LATER: Should calculate result from an interpolation between the next -- lower and higher altitudes in table, rather than rounding to nearest. -- From: http://www.aerospaceweb.org/question/atmosphere/q0112.shtml local mach_table = { -- a = 799.5, 787.0, 774.2, 761.207051, -- -3 to 0 748.0, 734.6, 721.0, 707.0, 692.8, 678.3, 663.5, 660.1, 660.1, 660.1, -- 1 to 10 660.1, 660.1, 660.1, 662.0, 664.3, 666.5, 668.9, 671.1, 673.4, 675.6, -- 11 to 20 677.9, 683.7, 689.9, 696.0, 702.1, 708.1, 714.0, 719.9, 725.8, 731.6, -- 21 to 30 737.3, 737.7, 737.7, 736.2, 730.5, 724.6, 718.8, 712.9, 707.0, 701.0, -- 31 to 40 695.0, 688.9, 682.8, 676.6, 670.4, 664.1, 657.8, 652.9, 648.3, 643.7, -- 41 to 50 639.1, 634.4, 629.6, 624.8, 620.0, 615.2, 613.2, 613.2, 613.2, 613.5, -- 51 to 60 614.4, 615.3, 616.7, 619.8, 623.4, 629.7, 635.0, 641.1, 650.6, 660.0, -- 61 to 70 672.5, 674.3, 676.1, 677.9, 679.7, 681.5, 683.3, 685.1, 686.8, 688.6, -- 71 to 80 } altitude = altitude or 0 local a = (altitude < 0) and -altitude or altitude a = floor(a / 5000 + 0.5) if altitude < 0 then a = -a end if a < -3 then a = -3 elseif a > 80 then a = 80 end return mach_table[a + 4] * 0.44704 -- mph converted to m/s end -- END: Code required only for built-in units. ------------------------------------------------------------------------ local function add_style(parms, class) -- Add selected template style to parms if not already present. parms.templatestyles = parms.templatestyles or {} if not parms.templatestyles[class] then parms.templatestyles[class] = parms.frame:extensionTag({ name = 'templatestyles', args = { src = text_code.titles[class] } }) end end local function get_styles(parms) -- Return string of required template styles, empty if none. if parms.templatestyles then local t = {} for _, v in pairs(parms.templatestyles) do table.insert(t, v) end return table.concat(t) end return '' end local function get_range(word) -- Return a range (string or table) corresponding to word (like "to"), -- or return nil if not a range word. local ranges = text_code.ranges return ranges.types[word] or ranges.types[ranges.aliases[word]] end local function check_mismatch(unit1, unit2) -- If unit1 cannot be converted to unit2, return an error message table. -- This allows conversion between units of the same type, and between -- Nm (normally torque) and ftlb (energy), as in gun-related articles. -- This works because Nm is the base unit (scale = 1) for both the -- primary type (torque), and the alternate type (energy, where Nm = J). -- A match occurs if the primary types are the same, or if unit1 matches -- the alternate type of unit2, and vice versa. That provides a whitelist -- of which conversions are permitted between normally incompatible types. if unit1.utype == unit2.utype or (unit1.utype == unit2.alttype and unit1.alttype == unit2.utype) then return nil end return { 'cvt_mismatch', unit1.utype, unit2.utype } end local function override_from(out_table, in_table, fields) -- Copy the specified fields from in_table to out_table, but do not -- copy nil fields (keep any corresponding field in out_table). for _, field in ipairs(fields) do if in_table[field] then out_table[field] = in_table[field] end end end local function shallow_copy(t) -- Return a shallow copy of table t. -- Do not need the features and overhead of the Scribunto mw.clone(). local result = {} for k, v in pairs(t) do result[k] = v end return result end local unit_mt = { -- Metatable to get missing values for a unit that does not accept SI prefixes. -- Warning: The boolean value 'false' is returned for any missing field -- so __index is not called twice for the same field in a given unit. __index = function (self, key) local value if key == 'name1' or key == 'sym_us' then value = self.symbol elseif key == 'name2' then value = self.name1 .. plural_suffix elseif key == 'name1_us' then value = self.name1 if not rawget(self, 'name2_us') then -- If name1_us is 'foot', do not make name2_us by appending plural_suffix. self.name2_us = self.name2 end elseif key == 'name2_us' then local raw1_us = rawget(self, 'name1_us') if raw1_us then value = raw1_us .. plural_suffix else value = self.name2 end elseif key == 'link' then value = self.name1 else value = false end rawset(self, key, value) return value end } local function prefixed_name(unit, name, index) -- Return unit name with SI prefix inserted at correct position. -- index = 1 (name1), 2 (name2), 3 (name1_us), 4 (name2_us). -- The position is a byte (not character) index, so use Lua's sub(). local pos = rawget(unit, 'prefix_position') if type(pos) == 'string' then pos = tonumber(split(pos, ',')[index]) end if pos then return name:sub(1, pos - 1) .. unit.si_name .. name:sub(pos) end return unit.si_name .. name end local unit_prefixed_mt = { -- Metatable to get missing values for a unit that accepts SI prefixes. -- Before use, fields si_name, si_prefix must be defined. -- The unit must define _symbol, _name1 and -- may define _sym_us, _name1_us, _name2_us -- (_sym_us, _name2_us may be defined for a language using sp=us -- to refer to a variant unrelated to U.S. units). __index = function (self, key) local value if key == 'symbol' then value = self.si_prefix .. self._symbol if value == 'l' then value = 'L' end elseif key == 'sym_us' then value = rawget(self, '_sym_us') if value then value = self.si_prefix .. value else value = self.symbol end elseif key == 'name1' then value = prefixed_name(self, self._name1, 1) elseif key == 'name2' then value = rawget(self, '_name2') if value then value = prefixed_name(self, value, 2) else value = self.name1 .. plural_suffix end elseif key == 'name1_us' then value = rawget(self, '_name1_us') if value then value = prefixed_name(self, value, 3) else value = self.name1 end elseif key == 'name2_us' then value = rawget(self, '_name2_us') if value then value = prefixed_name(self, value, 4) elseif rawget(self, '_name1_us') then value = self.name1_us .. plural_suffix else value = self.name2 end elseif key == 'link' then value = self.name1 else value = false end rawset(self, key, value) return value end } local unit_per_mt = { -- Metatable to get values for a per unit of form "x/y". -- This is never called to determine a unit name or link because per units -- are handled as a special case. -- Similarly, the default output is handled elsewhere, and for a symbol -- this is only called from get_default() for default_exceptions. __index = function (self, key) local value if key == 'symbol' then local per = self.per local unit1, unit2 = per[1], per[2] if unit1 then value = unit1[key] .. '/' .. unit2[key] else value = '/' .. unit2[key] end elseif key == 'sym_us' then value = self.symbol elseif key == 'scale' then local per = self.per local unit1, unit2 = per[1], per[2] value = (unit1 and unit1.scale or 1) * self.scalemultiplier / unit2.scale else value = false end rawset(self, key, value) return value end } local function make_per(unitcode, unit_table, ulookup) -- Return true, t where t is a per unit with unit codes expanded to unit tables, -- or return false, t where t is an error message table. local result = { unitcode = unitcode, utype = unit_table.utype, per = {} } override_from(result, unit_table, { 'invert', 'iscomplex', 'default', 'link', 'symbol', 'symlink' }) result.symbol_raw = (result.symbol or false) -- to distinguish between a defined exception and a metatable calculation local prefix for i, v in ipairs(unit_table.per) do if i == 1 and v == '' then -- First unit symbol can be empty; that gives a nil first unit table. elseif i == 1 and text_code.currency[v] then prefix = currency_text or v else local success, t = ulookup(v) if not success then return false, t end result.per[i] = t end end local multiplier = unit_table.multiplier if not result.utype then -- Creating an automatic per unit. local unit1 = result.per[1] local utype = (unit1 and unit1.utype or prefix or '') .. '/' .. result.per[2].utype local t = data_code.per_unit_fixups[utype] if t then if type(t) == 'table' then utype = t.utype or utype result.link = result.link or t.link multiplier = multiplier or t.multiplier else utype = t end end result.utype = utype end result.scalemultiplier = multiplier or 1 result.vprefix = prefix or false -- set to non-nil to avoid calling __index return true, setmetatable(result, unit_per_mt) end local function lookup(parms, unitcode, what, utable, fails, depth) -- Return true, t where t is a copy of the unit's converter table, -- or return false, t where t is an error message table. -- Parameter 'what' determines whether combination units are accepted: -- 'no_combination' : single unit only -- 'any_combination' : single unit or combination or output multiple -- 'only_multiple' : single unit or output multiple only -- Parameter unitcode is a symbol (like 'g'), with an optional SI prefix (like 'kg'). -- If, for example, 'kg' is in this table, that entry is used; -- otherwise the prefix ('k') is applied to the base unit ('g'). -- If unitcode is a known combination code (and if allowed by what), -- a table of output multiple unit tables is included in the result. -- For compatibility with the old template, an underscore in a unitcode is -- replaced with a space so usage like {{convert|350|board_feet}} works. -- Wikignomes may also put two spaces or "&nbsp;" in combinations, so -- replace underscore, "&nbsp;", and multiple spaces with a single space. utable = utable or parms.unittable or all_units fails = fails or {} depth = depth and depth + 1 or 1 if depth > 9 then -- There are ways to mistakenly define units which result in infinite -- recursion when lookup() is called. That gives a long delay and very -- confusing error messages, so the depth parameter is used as a guard. return false, { 'cvt_lookup', unitcode } end if unitcode == nil or unitcode == '' then return false, { 'cvt_no_unit' } end unitcode = unitcode:gsub('_', ' '):gsub('&nbsp;', ' '):gsub(' +', ' ') local function call_make_per(t) return make_per(unitcode, t, function (ucode) return lookup(parms, ucode, 'no_combination', utable, fails, depth) end ) end local t = utable[unitcode] if t then if t.shouldbe then return false, { 'cvt_should_be', t.shouldbe } end if t.sp_us then parms.opt_sp_us = true end local target = t.target -- nil, or unitcode is an alias for this target if target then local success, result = lookup(parms, target, what, utable, fails, depth) if not success then return false, result end override_from(result, t, { 'customary', 'default', 'link', 'symbol', 'symlink', 'usename' }) local multiplier = t.multiplier if multiplier then result.multiplier = tostring(multiplier) result.scale = result.scale * multiplier end return true, result end if t.per then return call_make_per(t) end local combo = t.combination -- nil or a table of unitcodes if combo then local multiple = t.multiple if what == 'no_combination' or (what == 'only_multiple' and not multiple) then return false, { 'cvt_bad_unit', unitcode } end -- Recursively create a combination table containing the -- converter table of each unitcode. local result = { utype = t.utype, multiple = multiple, combination = {} } local cvt = result.combination for i, v in ipairs(combo) do local success, t = lookup(parms, v, multiple and 'no_combination' or 'only_multiple', utable, fails, depth) if not success then return false, t end cvt[i] = t end return true, result end local result = shallow_copy(t) result.unitcode = unitcode if result.prefixes then result.si_name = '' result.si_prefix = '' return true, setmetatable(result, unit_prefixed_mt) end return true, setmetatable(result, unit_mt) end local SIprefixes = text_code.SIprefixes for plen = SIprefixes[1] or 2, 1, -1 do -- Look for an SI prefix; should never occur with an alias. -- Check for longer prefix first ('dam' is decametre). -- SIprefixes[1] = prefix maximum #characters (as seen by mw.ustring.sub). local prefix = usub(unitcode, 1, plen) local si = SIprefixes[prefix] if si then local t = utable[usub(unitcode, plen+1)] if t and t.prefixes then local result = shallow_copy(t) result.unitcode = unitcode result.si_name = parms.opt_sp_us and si.name_us or si.name result.si_prefix = si.prefix or prefix result.scale = t.scale * 10 ^ (si.exponent * t.prefixes) return true, setmetatable(result, unit_prefixed_mt) end end end -- Accept user-defined combinations like "acre+m2+ha" or "acre m2 ha" for output. -- If '+' is used, each unit code can include a space, and any error is fatal. -- If ' ' is used and if each space-separated word is a unit code, it is a combo, -- but errors are not fatal so the unit code can be looked up as an extra unit. local err_is_fatal local combo = collection() if unitcode:find('+', 1, true) then err_is_fatal = true for item in (unitcode .. '+'):gmatch('%s*(.-)%s*%+') do if item ~= '' then combo:add(item) end end elseif unitcode:find('%s') then for item in unitcode:gmatch('%S+') do combo:add(item) end end if combo.n > 1 then local function lookup_combo() if what == 'no_combination' or what == 'only_multiple' then return false, { 'cvt_bad_unit', unitcode } end local result = { combination = {} } local cvt = result.combination for i, v in ipairs(combo) do local success, t = lookup(parms, v, 'only_multiple', utable, fails, depth) if not success then return false, t end if i == 1 then result.utype = t.utype else local mismatch = check_mismatch(result, t) if mismatch then return false, mismatch end end cvt[i] = t end return true, result end local success, result = lookup_combo() if success or err_is_fatal then return success, result end end -- Accept any unit with an engineering notation prefix like "e6cuft" -- (million cubic feet), but not chained prefixes like "e3e6cuft", -- and not if the unit is a combination or multiple, -- and not if the unit has an offset or is a built-in. -- Only en digits are accepted. local e, exponent, baseunit = unitcode:match('^([Ee])(%d+)(.*)') if exponent then local engscale = text_code.eng_scales[exponent] if engscale then local success, result = lookup(parms, baseunit, 'no_combination', utable, fails, depth) if success and not (result.offset or result.builtin or result.engscale) then if e == 'E' then result.this_number_word = true unitcode = 'e' .. unitcode:sub(2) end result.unitcode = unitcode -- 'e6cuft' not 'cuft' result.defkey = unitcode -- key to lookup default exception result.engscale = engscale result.scale = result.scale * 10 ^ tonumber(exponent) return true, result end end end -- Look for x/y; split on right-most slash to get scale correct (x/y/z is x/y per z). local top, bottom = unitcode:match('^(.-)/([^/]+)$') if top and not unitcode:find('e%d') then -- If valid, create an automatic per unit for an "x/y" unit code. -- The unitcode must not include extraneous spaces. -- Engineering notation (apart from at start and which has been stripped before here), -- is not supported so do not make a per unit if find text like 'e3' in unitcode. local success, result = call_make_per({ per = {top, bottom} }) if success then return true, result end end if not parms.opt_ignore_error and not get_range(unitcode) then -- Want the "what links here" list for the extra_module to show only cases -- where an extra unit is used, so do not require it if invoked from {{val}} -- or if looking up a range word which cannot be a unit. if not extra_units then local success, extra = pcall(function () return require(extra_module).extra_units end) if success and type(extra) == 'table' then extra_units = extra end end if extra_units then -- A unit in one data table might refer to a unit in the other table, so -- switch between them, relying on fails or depth to terminate loops. if not fails[unitcode] then fails[unitcode] = true local other = (utable == all_units) and extra_units or all_units local success, result = lookup(parms, unitcode, what, other, fails, depth) if success then return true, result end end end end if to_en_table then -- At fawiki it is common to translate all digits so a unit like "km2" becomes "km۲". local en_code = ustring.gsub(unitcode, '%d', to_en_table) if en_code ~= unitcode then return lookup(parms, en_code, what, utable, fails, depth) end end return false, { 'cvt_unknown', unitcode } end local function valid_number(num) -- Return true if num is a valid number. -- In Scribunto (different from some standard Lua), when expressed as a string, -- overflow or other problems are indicated with text like "inf" or "nan" -- which are regarded as invalid here (each contains "n"). if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then return true end end local function hyphenated(name, parts) -- Return a hyphenated form of given name (for adjectival usage). -- The name may be linked and the target of the link must not be changed. -- Hypothetical examples: -- [[long ton|ton]] → [[long ton|ton]] (no change) -- [[tonne|long ton]] → [[tonne|long-ton]] -- [[metric ton|long ton]] → [[metric ton|long-ton]] -- [[long ton]] → [[long ton|long-ton]] -- Input can also have multiple links in a single name like: -- [[United States customary units|U.S.]] [[US gallon|gallon]] -- [[mile]]s per [[United States customary units|U.S.]] [[quart]] -- [[long ton]]s per [[short ton]] -- Assume that links cannot be nested (never like "[[abc[[def]]ghi]]"). -- This uses a simple and efficient procedure that works for most cases. -- Some units (if used) would require more, and can later think about -- adding a method to handle exceptions. -- The procedure is to replace each space with a hyphen, but -- not a space after ')' [for "(pre-1954&nbsp;US) nautical mile"], and -- not spaces immediately before '(' or in '(...)' [for cases like -- "British thermal unit (ISO)" and "Calorie (International Steam Table)"]. if name:find(' ', 1, true) then if parts then local pos if name:sub(1, 1) == '(' then pos = name:find(')', 1, true) if pos then return name:sub(1, pos+1) .. name:sub(pos+2):gsub(' ', '-') end elseif name:sub(-1) == ')' then pos = name:find('(', 1, true) if pos then return name:sub(1, pos-2):gsub(' ', '-') .. name:sub(pos-1) end end return name:gsub(' ', '-') end parts = collection() for before, item, after in name:gmatch('([^[]*)(%[%[[^[]*%]%])([^[]*)') do if item:find(' ', 1, true) then local prefix local plen = item:find('|', 1, true) if plen then prefix = item:sub(1, plen) item = item:sub(plen + 1, -3) else prefix = item:sub(1, -3) .. '|' item = item:sub(3, -3) end item = prefix .. hyphenated(item, parts) .. ']]' end parts:add(before:gsub(' ', '-') .. item .. after:gsub(' ', '-')) end if parts.n == 0 then -- No link like "[[...]]" was found in the original name. parts:add(hyphenated(name, parts)) end return table.concat(parts) end return name end local function hyphenated_maybe(parms, want_name, sep, id, inout) -- Return s, f where -- s = id, possibly modified -- f = true if hyphenated -- Possible modifications: hyphenate; prepend '-'; append mid text. if id == nil or id == '' then return '' end local mid = (inout == (parms.opt_flip and 'out' or 'in')) and parms.mid or '' if want_name then if parms.opt_adjectival then return '-' .. hyphenated(id) .. mid, true end if parms.opt_add_s and id:sub(-1) ~= 's' then id = id .. 's' -- for nowiki end end return sep .. id .. mid end local function use_minus(text) -- Return text with Unicode minus instead of '-', if present. if text:sub(1, 1) == '-' then return MINUS .. text:sub(2) end return text end local function digit_groups(parms, text, method) -- Return a numbered table of groups of digits (left-to-right, in local language). -- Parameter method is a number or nil: -- 3 for 3-digit grouping (default), or -- 2 for 3-then-2 grouping (only for digits before decimal mark). local len_right local len_left = text:find('.', 1, true) if len_left then len_right = #text - len_left len_left = len_left - 1 else len_left = #text end local twos = method == 2 and len_left > 5 local groups = collection() local run = len_left local n if run < 4 or (run == 4 and parms.opt_comma5) then if parms.opt_gaps then n = run else n = #text end elseif twos then n = run % 2 == 0 and 1 or 2 else n = run % 3 == 0 and 3 or run % 3 end while run > 0 do groups:add(n) run = run - n n = (twos and run > 3) and 2 or 3 end if len_right then if groups.n == 0 then groups:add(0) end if parms.opt_gaps and len_right > 3 then local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit local isfirst = true run = len_right while run > 0 do n = (want4 and run == 4) and 4 or (run > 3 and 3 or run) if isfirst then isfirst = false groups[groups.n] = groups[groups.n] + 1 + n else groups:add(n) end run = run - n end else groups[groups.n] = groups[groups.n] + 1 + len_right end end local pos = 1 for i, length in ipairs(groups) do groups[i] = from_en(text:sub(pos, pos + length - 1)) pos = pos + length end return groups end function with_separator(parms, text) -- for forward declaration above -- Input text is a number in en digits with optional '.' decimal mark. -- Return an equivalent, formatted for display: -- with a custom decimal mark instead of '.', if wanted -- with thousand separators inserted, if wanted -- digits in local language -- The given text is like '123' or '123.' or '12345.6789'. -- The text has no sign (caller inserts that later, if necessary). -- When using gaps, they are inserted before and after the decimal mark. -- Separators are inserted only before the decimal mark. -- A trailing dot (as in '123.') is removed because their use appears to -- be accidental, and such a number should be shown as '123' or '123.0'. -- It is useful for convert to suppress the dot so, for example, '4000.' -- is a simple way of indicating that all the digits are significant. if text:sub(-1) == '.' then text = text:sub(1, -2) end if #text < 4 or parms.opt_nocomma or numsep == '' then return from_en(text) end local groups = digit_groups(parms, text, group_method) if parms.opt_gaps then if groups.n <= 1 then return groups[1] or '' end local nowrap = '<span style="white-space: nowrap">' local gap = '<span style="margin-left: 0.25em">' local close = '</span>' return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close end return table.concat(groups, numsep) end -- An input value like 1.23e12 is displayed using scientific notation (1.23×10¹²). -- That also makes the output use scientific notation, except for small values. -- In addition, very small or very large output values use scientific notation. -- Use format(fmtpower, significand, '10', exponent) where each argument is a string. local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>' local function with_exponent(parms, show, exponent) -- Return wikitext to display the implied value in scientific notation. -- Input uses en digits; output uses digits in local language. return format(fmtpower, with_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent)))) end local function make_sigfig(value, sigfig) -- Return show, exponent that are equivalent to the result of -- converting the number 'value' (where value >= 0) to a string, -- rounded to 'sigfig' significant figures. -- The returned items are: -- show: a string of digits; no sign and no dot; -- there is an implied dot before show. -- exponent: a number (an integer) to shift the implied dot. -- Resulting value = tonumber('.' .. show) * 10^exponent. -- Examples: -- make_sigfig(23.456, 3) returns '235', 2 (.235 * 10^2). -- make_sigfig(0.0023456, 3) returns '235', -2 (.235 * 10^-2). -- make_sigfig(0, 3) returns '000', 1 (.000 * 10^1). if sigfig <= 0 then sigfig = 1 elseif sigfig > maxsigfig then sigfig = maxsigfig end if value == 0 then return string.rep('0', sigfig), 1 end local exp, fracpart = math.modf(log10(value)) if fracpart >= 0 then fracpart = fracpart - 1 exp = exp + 1 end local digits = format('%.0f', 10^(fracpart + sigfig)) if #digits > sigfig then -- Overflow (for sigfig=3: like 0.9999 rounding to "1000"; need "100"). digits = digits:sub(1, sigfig) exp = exp + 1 end assert(#digits == sigfig, 'Bug: rounded number has wrong length') return digits, exp end -- Fraction output format. local fracfmt = { { -- Like {{frac}} (fraction slash). '<span class="frac">{SIGN}<span class="num">{NUM}</span>&frasl;<span class="den">{DEN}</span></span>', -- 1/2 '<span class="frac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="num">{NUM}</span>&frasl;<span class="den">{DEN}</span></span>', -- 1+2/3 style = 'frac', }, { -- Like {{sfrac}} (stacked fraction, that is, horizontal bar). '<span class="sfrac tion">{SIGN}<span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span>', -- 1//2 '<span class="sfrac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="tion"><span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span></span>', -- 1+2//3 style = 'sfrac', }, } local function format_fraction(parms, inout, negative, wholestr, numstr, denstr, do_spell, style) -- Return wikitext for a fraction, possibly spelled. -- Inputs use en digits and have no sign; output uses digits in local language. local wikitext if not style then style = parms.opt_fraction_horizontal and 2 or 1 end if wholestr == '' then wholestr = nil end local substitute = { SIGN = negative and MINUS or '', WHOLE = wholestr and with_separator(parms, wholestr), NUM = from_en(numstr), DEN = from_en(denstr), } wikitext = fracfmt[style][wholestr and 2 or 1]:gsub('{(%u+)}', substitute) if do_spell then if negative then if wholestr then wholestr = '-' .. wholestr else numstr = '-' .. numstr end end local s = spell_number(parms, inout, wholestr, numstr, denstr) if s then return s end end add_style(parms, fracfmt[style].style) return wikitext end local function format_number(parms, show, exponent, isnegative) -- Parameter show is a string or a table containing strings. -- Each string is a formatted number in en digits and optional '.' decimal mark. -- A table represents a fraction: integer, numerator, denominator; -- if a table is given, exponent must be nil. -- Return t where t is a table with fields: -- show = wikitext formatted to display implied value -- (digits in local language) -- is_scientific = true if show uses scientific notation -- clean = unformatted show (possibly adjusted and with inserted '.') -- (en digits) -- sign = '' or MINUS -- exponent = exponent (possibly adjusted) -- The clean and exponent fields can be used to calculate the -- rounded absolute value, if needed. -- -- The value implied by the arguments is found from: -- exponent is nil; and -- show is a string of digits (no sign), with an optional dot; -- show = '123.4' is value 123.4, '1234' is value 1234.0; -- or: -- exponent is an integer indicating where dot should be; -- show is a string of digits (no sign and no dot); -- there is an implied dot before show; -- show does not start with '0'; -- show = '1234', exponent = 3 is value 0.1234*10^3 = 123.4. -- -- The formatted result: -- * Is for an output value and is spelled if wanted and possible. -- * Includes a Unicode minus if isnegative and not spelled. -- * Uses a custom decimal mark, if wanted. -- * Has digits grouped where necessary, if wanted. -- * Uses scientific notation if requested, or for very small or large values -- (which forces result to not be spelled). -- * Has no more than maxsigfig significant digits -- (same as old template and {{#expr}}). local xhi, xlo -- these control when scientific notation (exponent) is used if parms.opt_scientific then xhi, xlo = 4, 2 -- default for output if input uses e-notation elseif parms.opt_scientific_always then xhi, xlo = 0, 0 -- always use scientific notation (experimental) else xhi, xlo = 10, 4 -- default end local sign = isnegative and MINUS or '' local maxlen = maxsigfig local tfrac if type(show) == 'table' then tfrac = show show = tfrac.wholestr assert(exponent == nil, 'Bug: exponent given with fraction') end if not tfrac and not exponent then local integer, dot, decimals = show:match('^(%d*)(%.?)(.*)') if integer == '0' or integer == '' then local zeros, figs = decimals:match('^(0*)([^0]?.*)') if #figs == 0 then if #zeros > maxlen then show = '0.' .. zeros:sub(1, maxlen) end elseif #zeros >= xlo then show = figs exponent = -#zeros elseif #figs > maxlen then show = '0.' .. zeros .. figs:sub(1, maxlen) end elseif #integer >= xhi then show = integer .. decimals exponent = #integer else maxlen = maxlen + #dot if #show > maxlen then show = show:sub(1, maxlen) end end end if exponent then local function zeros(n) return string.rep('0', n) end if #show > maxlen then show = show:sub(1, maxlen) end if exponent > xhi or exponent <= -xlo or (exponent == xhi and show ~= '1' .. zeros(xhi - 1)) then -- When xhi, xlo = 10, 4 (the default), scientific notation is used if the -- rounded value satisfies: value >= 1e9 or value < 1e-4 (1e9 = 0.1e10), -- except if show is '1000000000' (1e9), for example: -- {{convert|1000000000|m|m|sigfig=10}} → 1,000,000,000 metres (1,000,000,000 m) local significand if #show > 1 then significand = show:sub(1, 1) .. '.' .. show:sub(2) else significand = show end return { clean = '.' .. show, exponent = exponent, sign = sign, show = sign .. with_exponent(parms, significand, exponent-1), is_scientific = true, } end if exponent >= #show then show = show .. zeros(exponent - #show) -- result has no dot elseif exponent <= 0 then show = '0.' .. zeros(-exponent) .. show else show = show:sub(1, exponent) .. '.' .. show:sub(exponent+1) end end local formatted_show if tfrac then show = tostring(tfrac.value) -- to set clean in returned table formatted_show = format_fraction(parms, 'out', isnegative, tfrac.wholestr, tfrac.numstr, tfrac.denstr, parms.opt_spell_out) else if isnegative and show:match('^0.?0*$') then sign = '' -- don't show minus if result is negative but rounds to zero end formatted_show = sign .. with_separator(parms, show) if parms.opt_spell_out then formatted_show = spell_number(parms, 'out', sign .. show) or formatted_show end end return { clean = show, sign = sign, show = formatted_show, is_scientific = false, -- to avoid calling __index } end local function extract_fraction(parms, text, negative) -- If text represents a fraction, return -- value, altvalue, show, denominator -- where -- value is a number (value of the fraction in argument text) -- altvalue is an alternate interpretation of any fraction for the hands -- unit where "12.1+3/4" means 12 hands 1.75 inches -- show is a string (formatted text for display of an input value, -- and is spelled if wanted and possible) -- denominator is value of the denominator in the fraction -- Otherwise, return nil. -- Input uses en digits and '.' decimal mark (input has been translated). -- Output uses digits in local language and local decimal mark, if any. ------------------------------------------------------------------------ -- Originally this function accepted x+y/z where x, y, z were any valid -- numbers, possibly with a sign. For example '1.23e+2+1.2/2.4' = 123.5, -- and '2-3/8' = 1.625. However, such usages were found to be errors or -- misunderstandings, so since August 2014 the following restrictions apply: -- x (if present) is an integer or has a single digit after decimal mark -- y and z are unsigned integers -- e-notation is not accepted -- The overall number can start with '+' or '-' (so '12+3/4' and '+12+3/4' -- and '-12-3/4' are valid). -- Any leading negative sign is removed by the caller, so only inputs -- like the following are accepted here (may have whitespace): -- negative = false false true (there was a leading '-') -- text = '2/3' '+2/3' '2/3' -- text = '1+2/3' '+1+2/3' '1-2/3' -- text = '12.3+1/2' '+12.3+1/2' '12.3-1/2' -- Values like '12.3+1/2' are accepted, but are intended only for use -- with the hands unit (not worth adding code to enforce that). ------------------------------------------------------------------------ local leading_plus, prefix, numstr, slashes, denstr = text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*(/+)%s*(%d+)%s*$') if not leading_plus then -- Accept a single U+2044 fraction slash because that may be pasted. leading_plus, prefix, numstr, denstr = text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*⁄%s*(%d+)%s*$') slashes = '/' end local numerator = tonumber(numstr) local denominator = tonumber(denstr) if numerator == nil or denominator == nil or (negative and leading_plus ~= '') then return nil end local whole, wholestr if prefix == '' then wholestr = '' whole = 0 else -- Any prefix must be like '12+' or '12-' (whole number and fraction sign); -- '12.3+' and '12.3-' are also accepted (single digit after decimal point) -- because '12.3+1/2 hands' is valid (12 hands 3½ inches). local num1, num2, frac_sign = prefix:match('^(%d+)(%.?%d?)%s*([+%-])$') if num1 == nil then return nil end if num2 == '' then -- num2 must be '' or like '.1' but not '.' or '.12' wholestr = num1 else if #num2 ~= 2 then return nil end wholestr = num1 .. num2 end if frac_sign ~= (negative and '-' or '+') then return nil end whole = tonumber(wholestr) if whole == nil then return nil end end local value = whole + numerator / denominator if not valid_number(value) then return nil end local altvalue = whole + numerator / (denominator * 10) local style = #slashes -- kludge: 1 or 2 slashes can be used to select style if style > 2 then style = 2 end local wikitext = format_fraction(parms, 'in', negative, leading_plus .. wholestr, numstr, denstr, parms.opt_spell_in, style) return value, altvalue, wikitext, denominator end local function extract_number(parms, text, another, no_fraction) -- Return true, info if can extract a number from text, -- where info is a table with the result, -- or return false, t where t is an error message table. -- Input can use en digits or digits in local language and can -- have references at the end. Accepting references is intended -- for use in infoboxes with a field for a value passed to convert. -- Parameter another = true if the expected value is not the first. -- Before processing, the input text is cleaned: -- * Any thousand separators (valid or not) are removed. -- * Any sign is replaced with '-' (if negative) or '' (otherwise). -- That replaces Unicode minus with '-'. -- If successful, the returned info table contains named fields: -- value = a valid number -- altvalue = a valid number, usually same as value but different -- if fraction used (for hands unit) -- singular = true if value is 1 or -1 (to use singular form of units) -- clean = cleaned text with any separators and sign removed -- (en digits and '.' decimal mark) -- show = text formatted for output, possibly with ref strip markers -- (digits in local language and custom decimal mark) -- The resulting show: -- * Is for an input value and is spelled if wanted and possible. -- * Has a rounded value, if wanted. -- * Has digits grouped where necessary, if wanted. -- * If negative, a Unicode minus is used; otherwise the sign is -- '+' (if the input text used '+'), or is '' (if no sign in input). text = strip(text or '') local reference local pos = text:find('\127', 1, true) if pos then local before = text:sub(1, pos - 1) local remainder = text:sub(pos) local refs = {} while #remainder > 0 do local ref, spaces ref, spaces, remainder = remainder:match('^(\127[^\127]*UNIQ[^\127]*%-ref[^\127]*\127)(%s*)(.*)') if ref then table.insert(refs, ref) else refs = {} break end end if #refs > 0 then text = strip(before) reference = table.concat(refs) end end local clean = to_en(text, parms) if clean == '' then return false, { another and 'cvt_no_num2' or 'cvt_no_num' } end local isnegative, propersign = false, '' -- most common case local singular, show, denominator local value = tonumber(clean) local altvalue if value then local sign = clean:sub(1, 1) if sign == '+' or sign == '-' then propersign = (sign == '+') and '+' or MINUS clean = clean:sub(2) end if value < 0 then isnegative = true value = -value end else local valstr for _, prefix in ipairs({ '-', MINUS, '&minus;' }) do -- Including '-' sets isnegative in case input is a fraction like '-2-3/4'. local plen = #prefix if clean:sub(1, plen) == prefix then valstr = clean:sub(plen + 1) if valstr:match('^%s') then -- "- 1" is invalid but "-1 - 1/2" is ok return false, { 'cvt_bad_num', text } end break end end if valstr then isnegative = true propersign = MINUS clean = valstr value = tonumber(clean) end if value == nil then if not no_fraction then value, altvalue, show, denominator = extract_fraction(parms, clean, isnegative) end if value == nil then return false, { 'cvt_bad_num', text } end if value <= 1 then singular = true -- for example, "½ mile" or "one half mile" (singular unit) end end end if not valid_number(value) then -- for example, "1e310" may overflow return false, { 'cvt_invalid_num' } end if show == nil then -- clean is a non-empty string with no spaces, and does not represent a fraction, -- and value = tonumber(clean) is a number >= 0. -- If the input uses e-notation, show will be displayed using a power of ten, but -- we use the number as given so it might not be normalized scientific notation. -- The input value is spelled if specified so any e-notation is ignored; -- that allows input like 2e6 to be spelled as "two million" which works -- because the spell module converts '2e6' to '2000000' before spelling. local function rounded(value, default, exponent) local precision = parms.opt_ri if precision then local fmt = '%.' .. format('%d', precision) .. 'f' local result = fmt:format(tonumber(value) + 2e-14) -- fudge for some common cases of bad rounding if not exponent then singular = (tonumber(result) == 1) end return result end return default end singular = (value == 1) local scientific local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)') if significand then show = with_exponent(parms, rounded(significand, significand, exponent), exponent) scientific = true else show = with_separator(parms, rounded(value, clean)) end show = propersign .. show if parms.opt_spell_in then show = spell_number(parms, 'in', propersign .. rounded(value, clean)) or show scientific = false end if scientific then parms.opt_scientific = true end end if isnegative and (value ~= 0) then value = -value altvalue = -(altvalue or value) end return true, { value = value, altvalue = altvalue or value, singular = singular, clean = clean, show = show .. (reference or ''), denominator = denominator, } end local function get_number(text) -- Return v, f where: -- v = nil (text is not a number) -- or -- v = value of text (text is a number) -- f = true if value is an integer -- Input can use en digits or digits in local language or separators, -- but no Unicode minus, and no fraction. if text then local number = tonumber(to_en(text)) if number then local _, fracpart = math.modf(number) return number, (fracpart == 0) end end end local function gcd(a, b) -- Return the greatest common denominator for the given values, -- which are known to be positive integers. if a > b then a, b = b, a end if a <= 0 then return b end local r = b % a if r <= 0 then return a end if r == 1 then return 1 end return gcd(r, a) end local function fraction_table(value, denominator) -- Return value as a string or a table: -- * If result is a string, there is no fraction, and the result -- is value formatted as a string of en digits. -- * If result is a table, it represents a fraction with named fields: -- wholestr, numstr, denstr (strings of en digits for integer, numerator, denominator). -- The result is rounded to the nearest multiple of (1/denominator). -- If the multiple is zero, no fraction is included. -- No fraction is included if value is very large as the fraction would -- be unhelpful, particularly if scientific notation is required. -- Input value is a non-negative number. -- Input denominator is a positive integer for the desired fraction. if value <= 0 then return '0' end if denominator <= 0 or value > 1e8 then return format('%.2f', value) end local integer, decimals = math.modf(value) local numerator = floor((decimals * denominator) + 0.5 + 2e-14) -- add fudge for some common cases of bad rounding if numerator >= denominator then integer = integer + 1 numerator = 0 end local wholestr = tostring(integer) if numerator > 0 then local div = gcd(numerator, denominator) if div > 1 then numerator = numerator / div denominator = denominator / div end return { wholestr = (integer > 0) and wholestr or '', numstr = tostring(numerator), denstr = tostring(denominator), value = value, } end return wholestr end local function preunits(count, preunit1, preunit2) -- If count is 1: -- ignore preunit2 -- return p1 -- else: -- preunit1 is used for preunit2 if the latter is empty -- return p1, p2 -- where: -- p1 is text to insert before the input unit -- p2 is text to insert before the output unit -- p1 or p2 may be nil to mean "no preunit" -- Using '+' gives output like "5+ feet" (no space before, but space after). local function withspace(text, wantboth) -- Return text with space before and, if wantboth, after. -- However, no space is added if there is a space or '&nbsp;' or '-' -- at that position ('-' is for adjectival text). -- There is also no space if text starts with '&' -- (e.g. '&deg;' would display a degree symbol with no preceding space). local char = text:sub(1, 1) if char == '&' then return text -- an html entity can be used to specify the exact display end if not (char == ' ' or char == '-' or char == '+') then text = ' ' .. text end if wantboth then char = text:sub(-1, -1) if not (char == ' ' or char == '-' or text:sub(-6, -1) == '&nbsp;') then text = text .. ' ' end end return text end local PLUS = '+ ' preunit1 = preunit1 or '' local trim1 = strip(preunit1) if count == 1 then if trim1 == '' then return nil end if trim1 == '+' then return PLUS end return withspace(preunit1, true) end preunit1 = withspace(preunit1) preunit2 = preunit2 or '' local trim2 = strip(preunit2) if trim1 == '+' then if trim2 == '' or trim2 == '+' then return PLUS, PLUS end preunit1 = PLUS end if trim2 == '' then if trim1 == '' then return nil, nil end preunit2 = preunit1 elseif trim2 == '+' then preunit2 = PLUS elseif trim2 == '&#32;' then -- trick to make preunit2 empty preunit2 = nil else preunit2 = withspace(preunit2) end return preunit1, preunit2 end local function range_text(range, want_name, parms, before, after, inout, options) -- Return before .. rtext .. after -- where rtext is the text that separates two values in a range. local rtext, adj_text, exception options = options or {} if type(range) == 'table' then -- Table must specify range text for ('off' and 'on') or ('input' and 'output'), -- and may specify range text for 'adj=on', -- and may specify exception = true. rtext = range[want_name and 'off' or 'on'] or range[((inout == 'in') == (parms.opt_flip == true)) and 'output' or 'input'] adj_text = range['adj'] exception = range['exception'] else rtext = range end if parms.opt_adjectival then if want_name or (exception and parms.abbr_org == 'on') then rtext = adj_text or rtext:gsub(' ', '-'):gsub('&nbsp;', '-') end end if rtext == '–' and (options.spaced or after:sub(1, #MINUS) == MINUS) then rtext = '&nbsp;– ' end return before .. rtext .. after end local function get_composite(parms, iparm, in_unit_table) -- Look for a composite input unit. For example, {{convert|1|yd|2|ft|3|in}} -- would result in a call to this function with -- iparm = 3 (parms[iparm] = "2", just after the first unit) -- in_unit_table = (unit table for "yd"; contains value 1 for number of yards) -- Return true, iparm, unit where -- iparm = index just after the composite units (7 in above example) -- unit = composite unit table holding all input units, -- or return true if no composite unit is present in parms, -- or return false, t where t is an error message table. local default, subinfo local composite_units, count = { in_unit_table }, 1 local fixups = {} local total = in_unit_table.valinfo[1].value local subunit = in_unit_table while subunit.subdivs do -- subdivs is nil or a table of allowed subdivisions local subcode = strip(parms[iparm+1]) local subdiv = subunit.subdivs[subcode] or subunit.subdivs[(all_units[subcode] or {}).target] if not subdiv then break end local success success, subunit = lookup(parms, subcode, 'no_combination') if not success then return false, subunit end -- should never occur success, subinfo = extract_number(parms, parms[iparm]) if not success then return false, subinfo end iparm = iparm + 2 subunit.inout = 'in' subunit.valinfo = { subinfo } -- Recalculate total as a number of subdivisions. -- subdiv[1] = number of subdivisions per previous unit (integer > 1). total = total * subdiv[1] + subinfo.value if not default then -- set by the first subdiv with a default defined default = subdiv.default end count = count + 1 composite_units[count] = subunit if subdiv.unit or subdiv.name then fixups[count] = { unit = subdiv.unit, name = subdiv.name, valinfo = subunit.valinfo } end end if count == 1 then return true -- no error and no composite unit end for i, fixup in pairs(fixups) do local unit = fixup.unit local name = fixup.name if not unit or (count > 2 and name) then composite_units[i].fixed_name = name else local success, alternate = lookup(parms, unit, 'no_combination') if not success then return false, alternate end -- should never occur alternate.inout = 'in' alternate.valinfo = fixup.valinfo composite_units[i] = alternate end end return true, iparm, { utype = in_unit_table.utype, scale = subunit.scale, -- scale of last (least significant) unit valinfo = { { value = total, clean = subinfo.clean, denominator = subinfo.denominator } }, composite = composite_units, default = default or in_unit_table.default } end local function translate_parms(parms, kv_pairs) -- Update fields in parms by translating each key:value in kv_pairs to terms -- used by this module (may involve translating from local language to English). -- Also, checks are performed which may display warnings, if enabled. -- Return true if successful or return false, t where t is an error message table. currency_text = nil -- local testing can hold module in memory; must clear globals if kv_pairs.adj and kv_pairs.sing then -- For enwiki (before translation), warn if attempt to use adj and sing -- as the latter is a deprecated alias for the former. if kv_pairs.adj ~= kv_pairs.sing and kv_pairs.sing ~= '' then add_warning(parms, 1, 'cvt_unknown_option', 'sing=' .. kv_pairs.sing) end kv_pairs.sing = nil end kv_pairs.comma = kv_pairs.comma or config.comma -- for plwiki who want default comma=5 for loc_name, loc_value in pairs(kv_pairs) do local en_name = text_code.en_option_name[loc_name] if en_name then local en_value = text_code.en_option_value[en_name] if en_value == 'INTEGER' then -- altitude_ft, altitude_m, frac, sigfig en_value = nil if loc_value == '' then add_warning(parms, 2, 'cvt_empty_option', loc_name) else local minimum local number, is_integer = get_number(loc_value) if en_name == 'sigfig' then minimum = 1 elseif en_name == 'frac' then minimum = 2 if number and number < 0 then parms.opt_fraction_horizontal = true number = -number end else minimum = -1e6 end if number and is_integer and number >= minimum then en_value = number else local m if en_name == 'frac' then m = 'cvt_bad_frac' elseif en_name == 'sigfig' then m = 'cvt_bad_sigfig' else m = 'cvt_bad_altitude' end add_warning(parms, 1, m, loc_name .. '=' .. loc_value) end end elseif en_value == 'TEXT' then -- $, input, qid, qual, stylein, styleout, tracking en_value = loc_value ~= '' and loc_value or nil -- accept non-empty user text with no validation if not en_value and (en_name == '$' or en_name == 'qid' or en_name == 'qual') then add_warning(parms, 2, 'cvt_empty_option', loc_name) elseif en_name == '$' then -- Value should be a single character like "€" for the euro currency symbol, but anything is accepted. currency_text = (loc_value == 'euro') and '€' or loc_value elseif en_name == 'input' then -- May have something like {{convert|input=}} (empty input) if source is an infobox -- with optional fields. In that case, want to output nothing rather than an error. parms.input_text = loc_value -- keep input because parms.input is nil if loc_value == '' end else en_value = en_value[loc_value] if en_value and en_value:sub(-1) == '?' then en_value = en_value:sub(1, -2) add_warning(parms, -1, 'cvt_deprecated', loc_name .. '=' .. loc_value) end if en_value == nil then if loc_value == '' then add_warning(parms, 2, 'cvt_empty_option', loc_name) else add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value) end elseif en_value == '' then en_value = nil -- an ignored option like adj=off elseif type(en_value) == 'string' and en_value:sub(1, 4) == 'opt_' then for _, v in ipairs(split(en_value, ',')) do local lhs, rhs = v:match('^(.-)=(.+)$') if rhs then parms[lhs] = tonumber(rhs) or rhs else parms[v] = true end end en_value = nil end end parms[en_name] = en_value else add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value) end end local abbr_entered = parms.abbr local cfg_abbr = config.abbr if cfg_abbr then -- Don't warn if invalid because every convert would show that warning. if cfg_abbr == 'on always' then parms.abbr = 'on' elseif cfg_abbr == 'off always' then parms.abbr = 'off' elseif parms.abbr == nil then if cfg_abbr == 'on default' then parms.abbr = 'on' elseif cfg_abbr == 'off default' then parms.abbr = 'off' end end end if parms.abbr then if parms.abbr == 'unit' then parms.abbr = 'on' parms.number_word = true end parms.abbr_org = parms.abbr -- original abbr, before any flip elseif parms.opt_hand_hh then parms.abbr_org = 'on' parms.abbr = 'on' else parms.abbr = 'out' -- default is to abbreviate output only (use symbol, not name) end if parms.opt_order_out then -- Disable options that do not work in a useful way with order=out. parms.opt_flip = nil -- override adj=flip parms.opt_spell_in = nil parms.opt_spell_out = nil parms.opt_spell_upper = nil end if parms.opt_spell_out and not abbr_entered then parms.abbr = 'off' -- should show unit name when spelling the output value end if parms.opt_flip then local function swap_in_out(option) local value = parms[option] if value == 'in' then parms[option] = 'out' elseif value == 'out' then parms[option] = 'in' end end swap_in_out('abbr') swap_in_out('lk') if parms.opt_spell_in and not parms.opt_spell_out then -- For simplicity, and because it does not appear to be needed, -- user cannot set an option to spell the output only. parms.opt_spell_in = nil parms.opt_spell_out = true end end if parms.opt_spell_upper then parms.spell_upper = parms.opt_flip and 'out' or 'in' end if parms.opt_table or parms.opt_tablecen then if abbr_entered == nil and parms.lk == nil then parms.opt_values = true end parms.table_align = parms.opt_table and 'right' or 'center' end if parms.table_align or parms.opt_sortable_on then parms.need_table_or_sort = true end local disp_joins = text_code.disp_joins local default_joins = disp_joins['b'] parms.join_between = default_joins[3] or '; ' local disp = parms.disp if disp == nil then -- special case for the most common setting parms.joins = default_joins elseif disp == 'x' then -- Later, parms.joins is set from the input parameters. else -- Old template does this. local abbr = parms.abbr if disp == 'slash' then if abbr_entered == nil then disp = 'slash-nbsp' elseif abbr == 'in' or abbr == 'out' then disp = 'slash-sp' else disp = 'slash-nosp' end elseif disp == 'sqbr' then if abbr == 'on' then disp = 'sqbr-nbsp' else disp = 'sqbr-sp' end end parms.joins = disp_joins[disp] or default_joins parms.join_between = parms.joins[3] or parms.join_between parms.wantname = parms.joins.wantname end if (en_default and not parms.opt_lang_local and (parms[1] or ''):find('%d')) or parms.opt_lang_en then from_en_table = nil end if en_default and from_en_table then -- For hiwiki: localized symbol/name is defined with the US symbol/name field, -- and is used if output uses localized numbers. parms.opt_sp_us = true end return true end local function get_values(parms) -- If successful, update parms and return true, v, i where -- v = table of input values -- i = index to next entry in parms after those processed here -- or return false, t where t is an error message table. local valinfo = collection() -- numbered table of input values local range = collection() -- numbered table of range items (having, for example, 2 range items requires 3 input values) local had_nocomma -- true if removed "nocomma" kludge from second parameter (like "tonocomma") local parm2 = strip(parms[2]) if parm2 and parm2:sub(-7, -1) == 'nocomma' then parms[2] = strip(parm2:sub(1, -8)) parms.opt_nocomma = true had_nocomma = true end local function extractor(i) -- If the parameter is not a value, try unpacking it as a range ("1-23" for "1 to 23"). -- However, "-1-2/3" is a negative fraction (-1⅔), so it must be extracted first. -- Do not unpack a parameter if it is like "3-1/2" which is sometimes incorrectly -- used instead of "3+1/2" (and which should not be interpreted as "3 to ½"). -- Unpacked items are inserted into the parms table. -- The tail recursion allows combinations like "1x2 to 3x4". local valstr = strip(parms[i]) -- trim so any '-' as a negative sign will be at start local success, result = extract_number(parms, valstr, i > 1) if not success and valstr and i < 20 then -- check i to limit abuse local lhs, sep, rhs = valstr:match('^(%S+)%s+(%S+)%s+(%S.*)') if lhs and not (sep == '-' and rhs:match('/')) then if sep:find('%d') then return success, result -- to reject {{convert|1 234 567|m}} with a decent message (en only) end parms[i] = rhs table.insert(parms, i, sep) table.insert(parms, i, lhs) return extractor(i) end if not valstr:match('%-.*/') then for _, sep in ipairs(text_code.ranges.words) do local start, stop = valstr:find(sep, 2, true) -- start at 2 to skip any negative sign for range '-' if start then parms[i] = valstr:sub(stop + 1) table.insert(parms, i, sep) table.insert(parms, i, valstr:sub(1, start - 1)) return extractor(i) end end end end return success, result end local i = 1 local is_change while true do local success, info = extractor(i) -- need to set parms.opt_nocomma before calling this if not success then return false, info end i = i + 1 if is_change then info.is_change = true -- value is after "±" and so is a change (significant for range like {{convert|5|±|5|°C}}) is_change = nil end valinfo:add(info) local range_item = get_range(strip(parms[i])) if not range_item then break end i = i + 1 range:add(range_item) if type(range_item) == 'table' then -- For range "x", if append unit to some values, append it to all. parms.in_range_x = parms.in_range_x or range_item.in_range_x parms.out_range_x = parms.out_range_x or range_item.out_range_x parms.abbr_range_x = parms.abbr_range_x or range_item.abbr_range_x is_change = range_item.is_range_change end end if range.n > 0 then if range.n > 30 then -- limit abuse, although 4 is a more likely upper limit return false, { 'cvt_invalid_num' } -- misleading message but it will do end parms.range = range elseif had_nocomma then return false, { 'cvt_unknown', parm2 } end return true, valinfo, i end local function simple_get_values(parms) -- If input is like "{{convert|valid_value|valid_unit|...}}", -- return true, i, in_unit, in_unit_table -- i = index in parms of what follows valid_unit, if anything. -- The valid_value is not negative and does not use a fraction, and -- no options requiring further processing of the input are used. -- Otherwise, return nothing or return false, parm1 for caller to interpret. -- Testing shows this function is successful for 96% of converts in articles, -- and that on average it speeds up converts by 8%. local clean = to_en(strip(parms[1] or ''), parms) if parms.opt_ri or parms.opt_spell_in or #clean > 10 or not clean:match('^[0-9.]+$') then return false, clean end local value = tonumber(clean) if not value then return end local info = { value = value, altvalue = value, singular = (value == 1), clean = clean, show = with_separator(parms, clean), } local in_unit = strip(parms[2]) local success, in_unit_table = lookup(parms, in_unit, 'no_combination') if not success then return end in_unit_table.valinfo = { info } return true, 3, in_unit, in_unit_table end local function wikidata_call(parms, operation, ...) -- Return true, s where s is the result of a Wikidata operation, -- or return false, t where t is an error message table. local function worker(...) wikidata_code = wikidata_code or require(wikidata_module) wikidata_data = wikidata_data or mw.loadData(wikidata_data_module) return wikidata_code[operation](wikidata_data, ...) end local success, status, result = pcall(worker, ...) if success then return status, result end if parms.opt_sortable_debug then -- Use debug=yes to crash if an error while accessing Wikidata. error('Error accessing Wikidata: ' .. status, 0) end return false, { 'cvt_wd_fail' } end local function get_parms(parms, args) -- If successful, update parms and return true, unit where -- parms is a table of all arguments passed to the template -- converted to named arguments, and -- unit is the input unit table; -- or return false, t where t is an error message table. -- For special processing (not a convert), can also return -- true, wikitext where wikitext is the final result. -- The returned input unit table may be for a fake unit using the specified -- unit code as the symbol and name, and with bad_mcode = message code table. -- MediaWiki removes leading and trailing whitespace from the values of -- named arguments. However, the values of numbered arguments include any -- whitespace entered in the template, and whitespace is used by some -- parameters (example: the numbered parameters associated with "disp=x"). local kv_pairs = {} -- table of input key:value pairs where key is a name; needed because cannot iterate parms and add new fields to it for k, v in pairs(args) do if type(k) == 'number' or k == 'test' then -- parameter "test" is reserved for testing and is not translated parms[k] = v else kv_pairs[k] = v end end if parms.test == 'wikidata' then local ulookup = function (ucode) -- Use empty table for parms so it does not accumulate results when used repeatedly. return lookup({}, ucode, 'no_combination') end return wikidata_call(parms, '_listunits', ulookup) end local success, msg = translate_parms(parms, kv_pairs) if not success then return false, msg end if parms.input then success, msg = wikidata_call(parms, '_adjustparameters', parms, 1) if not success then return false, msg end end local success, i, in_unit, in_unit_table = simple_get_values(parms) if not success then if type(i) == 'string' and i:match('^NNN+$') then -- Some infoboxes have examples like {{convert|NNN|m}} (3 or more "N"). -- Output an empty string for these. return false, { 'cvt_no_output' } end local valinfo success, valinfo, i = get_values(parms) if not success then return false, valinfo end in_unit = strip(parms[i]) i = i + 1 success, in_unit_table = lookup(parms, in_unit, 'no_combination') if not success then in_unit = in_unit or '' if parms.opt_ignore_error then -- display given unit code with no error (for use with {{val}}) in_unit_table = '' -- suppress error message and prevent processing of output unit end in_unit_table = setmetatable({ symbol = in_unit, name2 = in_unit, utype = in_unit, scale = 1, default = '', defkey = '', linkey = '', bad_mcode = in_unit_table }, unit_mt) end in_unit_table.valinfo = valinfo end if parms.test == 'msg' then -- Am testing the messages produced when no output unit is specified, and -- the input unit has a missing or invalid default. -- Set two units for testing that. -- LATER: Remove this code. if in_unit == 'chain' then in_unit_table.default = nil -- no default elseif in_unit == 'rd' then in_unit_table.default = "ft!X!m" -- an invalid expression end end in_unit_table.inout = 'in' -- this is an input unit if not parms.range then local success, inext, composite_unit = get_composite(parms, i, in_unit_table) if not success then return false, inext end if composite_unit then in_unit_table = composite_unit i = inext end end if in_unit_table.builtin == 'mach' then -- As with old template, a number following Mach as the input unit is the altitude. -- That is deprecated: should use altitude_ft=NUMBER or altitude_m=NUMBER. local success, info success = tonumber(parms[i]) -- this will often work and will give correct result for values like 2e4 without forcing output scientific notation if success then info = { value = success } else success, info = extract_number(parms, parms[i], false, true) end if success then i = i + 1 in_unit_table.altitude = info.value end end local word = strip(parms[i]) i = i + 1 local precision, is_bad_precision local function set_precision(text) local number, is_integer = get_number(text) if number then if is_integer then precision = number else precision = text is_bad_precision = true end return true -- text was used for precision, good or bad end end if word and not set_precision(word) then parms.out_unit = parms.out_unit or word if set_precision(strip(parms[i])) then i = i + 1 end end if parms.opt_adj_mid then word = parms[i] i = i + 1 if word then -- mid-text words if word:sub(1, 1) == '-' then parms.mid = word else parms.mid = ' ' .. word end end end if parms.opt_one_preunit then parms[parms.opt_flip and 'preunit2' or 'preunit1'] = preunits(1, parms[i]) i = i + 1 end if parms.disp == 'x' then -- Following is reasonably compatible with the old template. local first = parms[i] or '' local second = parms[i+1] or '' i = i + 2 if strip(first) == '' then -- user can enter '&#32;' rather than ' ' to avoid the default first = ' [&nbsp;' .. first second = '&nbsp;]' .. second end parms.joins = { first, second } elseif parms.opt_two_preunits then local p1, p2 = preunits(2, parms[i], parms[i+1]) i = i + 2 if parms.preunit1 then -- To simplify documentation, allow unlikely use of adj=pre with disp=preunit -- (however, an output unit must be specified with adj=pre and with disp=preunit). parms.preunit1 = parms.preunit1 .. p1 parms.preunit2 = p2 else parms.preunit1, parms.preunit2 = p1, p2 end end if precision == nil then if set_precision(strip(parms[i])) then i = i + 1 end end if is_bad_precision then add_warning(parms, 1, 'cvt_bad_prec', precision) else parms.precision = precision end for j = i, i + 3 do local parm = parms[j] -- warn if find a non-empty extraneous parameter if parm and parm:match('%S') then add_warning(parms, 1, 'cvt_unknown_option', parm) break end end return true, in_unit_table end local function record_default_precision(parms, out_current, precision) -- If necessary, adjust parameters and return a possibly adjusted precision. -- When converting a range of values where a default precision is required, -- that default is calculated for each value because the result sometimes -- depends on the precise input and output values. This function may cause -- the entire convert process to be repeated in order to ensure that the -- same default precision is used for each individual convert. -- If that were not done, a range like 1000 to 1000.4 may give poor results -- because the first output could be heavily rounded, while the second is not. -- For range 1000.4 to 1000, this function can give the second convert the -- same default precision that was used for the first. if not parms.opt_round_each then local maxdef = out_current.max_default_precision if maxdef then if maxdef < precision then parms.do_convert_again = true out_current.max_default_precision = precision else precision = out_current.max_default_precision end else out_current.max_default_precision = precision end end return precision end local function default_precision(parms, invalue, inclean, denominator, outvalue, in_current, out_current, extra) -- Return a default value for precision (an integer like 2, 0, -2). -- If denominator is not nil, it is the value of the denominator in inclean. -- Code follows procedures used in old template. local fudge = 1e-14 -- {{Order of magnitude}} adds this, so we do too local prec, minprec, adjust local subunit_ignore_trailing_zero local subunit_more_precision -- kludge for "in" used in input like "|2|ft|6|in" local composite = in_current.composite if composite then subunit_ignore_trailing_zero = true -- input "|2|st|10|lb" has precision 0, not -1 if composite[#composite].exception == 'subunit_more_precision' then subunit_more_precision = true -- do not use standard precision with input like "|2|ft|6|in" end end if denominator and denominator > 0 then prec = math.max(log10(denominator), 1) else -- Count digits after decimal mark, handling cases like '12.345e6'. local exponent local integer, dot, decimals, expstr = inclean:match('^(%d*)(%.?)(%d*)(.*)') local e = expstr:sub(1, 1) if e == 'e' or e == 'E' then exponent = tonumber(expstr:sub(2)) end if dot == '' then prec = subunit_ignore_trailing_zero and 0 or -integer:match('0*$'):len() else prec = #decimals end if exponent then -- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5. prec = prec - exponent end end if in_current.istemperature and out_current.istemperature then -- Converting between common temperatures (°C, °F, °R, K); not keVT. -- Kelvin value can be almost zero, or small but negative due to precision problems. -- Also, an input value like -300 C (below absolute zero) gives negative kelvins. -- Calculate minimum precision from absolute value. adjust = 0 local kelvin = abs((invalue - in_current.offset) * in_current.scale) if kelvin < 1e-8 then -- assume nonzero due to input or calculation precision problem minprec = 2 else minprec = 2 - floor(log10(kelvin) + fudge) -- 3 sigfigs in kelvin end else if invalue == 0 or outvalue <= 0 then -- We are never called with a negative outvalue, but it might be zero. -- This is special-cased to avoid calculation exceptions. return record_default_precision(parms, out_current, 0) end if out_current.exception == 'integer_more_precision' and floor(invalue) == invalue then -- With certain output units that sometimes give poor results -- with default rounding, use more precision when the input -- value is equal to an integer. An example of a poor result -- is when input 50 gives a smaller output than input 49.5. -- Experiment shows this helps, but it does not eliminate all -- surprises because it is not clear whether "50" should be -- interpreted as "from 45 to 55" or "from 49.5 to 50.5". adjust = -log10(in_current.scale) elseif subunit_more_precision then -- Conversion like "{{convert|6|ft|1|in|cm}}" (where subunit is "in") -- has a non-standard adjust value, to give more output precision. adjust = log10(out_current.scale) + 2 else adjust = log10(abs(invalue / outvalue)) end adjust = adjust + log10(2) -- Ensure that the output has at least two significant figures. minprec = 1 - floor(log10(outvalue) + fudge) end if extra then adjust = extra.adjust or adjust minprec = extra.minprec or minprec end return record_default_precision(parms, out_current, math.max(floor(prec + adjust), minprec)) end local function convert(parms, invalue, info, in_current, out_current) -- Convert given input value from one unit to another. -- Return output_value (a number) if a simple convert, or -- return f, t where -- f = true, t = table of information with results, or -- f = false, t = error message table. local inscale = in_current.scale local outscale = out_current.scale if not in_current.iscomplex and not out_current.iscomplex then return invalue * (inscale / outscale) -- minimize overhead for most common case end if in_current.invert or out_current.invert then -- Inverted units, such as inverse length, inverse time, or -- fuel efficiency. Built-in units do not have invert set. if (in_current.invert or 1) * (out_current.invert or 1) < 0 then return 1 / (invalue * inscale * outscale) end return invalue * (inscale / outscale) elseif in_current.offset then -- Temperature (there are no built-ins for this type of unit). if info.is_change then return invalue * (inscale / outscale) end return (invalue - in_current.offset) * (inscale / outscale) + out_current.offset else -- Built-in unit. local in_builtin = in_current.builtin local out_builtin = out_current.builtin if in_builtin and out_builtin then if in_builtin == out_builtin then return invalue end -- There are no cases (yet) where need to convert from one -- built-in unit to another, so this should never occur. return false, { 'cvt_bug_convert' } end if in_builtin == 'mach' or out_builtin == 'mach' then -- Should check that only one altitude is given but am planning to remove -- in_current.altitude (which can only occur when Mach is the input unit), -- and out_current.altitude cannot occur. local alt = parms.altitude_ft or in_current.altitude if not alt and parms.altitude_m then alt = parms.altitude_m / 0.3048 -- 1 ft = 0.3048 m end local spd = speed_of_sound(alt) if in_builtin == 'mach' then inscale = spd return invalue * (inscale / outscale) end outscale = spd local adjust = 0.1 / inscale return true, { outvalue = invalue * (inscale / outscale), adjust = log10(adjust) + log10(2), } elseif in_builtin == 'hand' then -- 1 hand = 4 inches; 1.2 hands = 6 inches. -- Decimals of a hand are only defined for the first digit, and -- the first fractional digit should be a number of inches (1, 2 or 3). -- However, this code interprets the entire fractional part as the number -- of inches / 10 (so 1.75 inches would be 0.175 hands). -- A value like 12.3 hands is exactly 12*4 + 3 inches; base default precision on that. local integer, fracpart = math.modf(invalue) local inch_value = 4 * integer + 10 * fracpart -- equivalent number of inches local factor = inscale / outscale if factor == 4 then -- Am converting to inches: show exact result, and use "inches" not "in" by default. if parms.abbr_org == nil then out_current.usename = true end local show = format('%g', abs(inch_value)) -- show and clean are unsigned if not show:find('e', 1, true) then return true, { invalue = inch_value, outvalue = inch_value, clean = show, show = show, } end end local outvalue = (integer + 2.5 * fracpart) * factor local fracstr = info.clean:match('%.(.*)') or '' local fmt if fracstr == '' then fmt = '%.0f' else fmt = '%.' .. format('%d', #fracstr - 1) .. 'f' end return true, { invalue = inch_value, clean = format(fmt, inch_value), outvalue = outvalue, minprec = 0, } end end return false, { 'cvt_bug_convert' } -- should never occur end local function user_style(parms, i) -- Return text for a user-specified style for a table cell, or '' if none, -- given i = 1 (input style) or 2 (output style). local style = parms[(i == 1) and 'stylein' or 'styleout'] if style then style = style:gsub('"', '') if style ~= '' then if style:sub(-1) ~= ';' then style = style .. ';' end return style end end return '' end local function make_table_or_sort(parms, invalue, info, in_current, scaled_top) -- Set options to handle output for a table or a sort key, or both. -- The text sort key is based on the value resulting from converting -- the input to a fake base unit with scale = 1, and other properties -- required for a conversion derived from the input unit. -- For other modules, return the sort key in a hidden span element, and -- the scaled value used to generate the sort key. -- If scaled_top is set, it is the scaled value of the numerator of a per unit -- to be combined with this unit (the denominator) to make the sort key. -- Scaling only works with units that convert with a factor (not temperature). local sortkey, scaled_value if parms.opt_sortable_on then local base = { -- a fake unit with enough fields for a valid convert scale = 1, invert = in_current.invert and 1, iscomplex = in_current.iscomplex, offset = in_current.offset and 0, } local outvalue, extra = convert(parms, invalue, info, in_current, base) if extra then outvalue = extra.outvalue end if in_current.istemperature then -- Have converted to kelvin; assume numbers close to zero have a -- rounding error and should be zero. if abs(outvalue) < 1e-12 then outvalue = 0 end end if scaled_top and outvalue ~= 0 then outvalue = scaled_top / outvalue end scaled_value = outvalue if not valid_number(outvalue) then if outvalue < 0 then sortkey = '1000000000000000000' else sortkey = '9000000000000000000' end elseif outvalue == 0 then sortkey = '5000000000000000000' else local mag = floor(log10(abs(outvalue)) + 1e-14) local prefix if outvalue > 0 then prefix = 7000 + mag else prefix = 2999 - mag outvalue = outvalue + 10^(mag+1) end sortkey = format('%d', prefix) .. format('%015.0f', floor(outvalue * 10^(14-mag))) end end local sortspan if sortkey and not parms.table_align then sortspan = parms.opt_sortable_debug and '<span data-sort-value="' .. sortkey .. '♠"><span style="border:1px solid">' .. sortkey .. '♠</span></span>' or '<span data-sort-value="' .. sortkey .. '♠"></span>' parms.join_before = sortspan end if parms.table_align then local sort if sortkey then sort = ' data-sort-value="' .. sortkey .. '"' if parms.opt_sortable_debug then parms.join_before = '<span style="border:1px solid">' .. sortkey .. '</span>' end else sort = '' end local style = 'style="text-align:' .. parms.table_align .. ';' local joins = {} for i = 1, 2 do joins[i] = (i == 1 and '' or '\n|') .. style .. user_style(parms, i) .. '"' .. sort .. '|' end parms.table_joins = joins end return sortspan, scaled_value end local cvt_to_hand local function cvtround(parms, info, in_current, out_current) -- Return true, t where t is a table with the conversion results; fields: -- show = rounded, formatted string with the result of converting value in info, -- using the rounding specified in parms. -- singular = true if result (after rounding and ignoring any negative sign) -- is "1", or like "1.00", or is a fraction with value < 1; -- (and more fields shown below, and a calculated 'absvalue' field). -- or return false, t where t is an error message table. -- Input info.clean uses en digits (it has been translated, if necessary). -- Output show uses en or non-en digits as appropriate, or can be spelled. if out_current.builtin == 'hand' then return cvt_to_hand(parms, info, in_current, out_current) end local invalue = in_current.builtin == 'hand' and info.altvalue or info.value local outvalue, extra = convert(parms, invalue, info, in_current, out_current) if parms.need_table_or_sort then parms.need_table_or_sort = nil -- process using first input value only make_table_or_sort(parms, invalue, info, in_current) end if extra then if not outvalue then return false, extra end invalue = extra.invalue or invalue outvalue = extra.outvalue end if not valid_number(outvalue) then return false, { 'cvt_invalid_num' } end local isnegative if outvalue < 0 then isnegative = true outvalue = -outvalue end local precision, show, exponent local denominator = out_current.frac if denominator then show = fraction_table(outvalue, denominator) else precision = parms.precision if not precision then if parms.sigfig then show, exponent = make_sigfig(outvalue, parms.sigfig) elseif parms.opt_round then local n = parms.opt_round if n == 0.5 then local integer, fracpart = math.modf(floor(2 * outvalue + 0.5) / 2) if fracpart == 0 then show = format('%.0f', integer) else show = format('%.1f', integer + fracpart) end else show = format('%.0f', floor((outvalue / n) + 0.5) * n) end elseif in_current.builtin == 'mach' then local sigfig = info.clean:gsub('^[0.]+', ''):gsub('%.', ''):len() + 1 show, exponent = make_sigfig(outvalue, sigfig) else local inclean = info.clean if extra then inclean = extra.clean or inclean show = extra.show end if not show then precision = default_precision(parms, invalue, inclean, info.denominator, outvalue, in_current, out_current, extra) end end end end if precision then if precision >= 0 then local fudge if precision <= 8 then -- Add a fudge to handle common cases of bad rounding due to inability -- to precisely represent some values. This makes the following work: -- {{convert|-100.1|C|K}} and {{convert|5555000|um|m|2}}. -- Old template uses #expr round, which invokes PHP round(). -- LATER: Investigate how PHP round() works. fudge = 2e-14 else fudge = 0 end local fmt = '%.' .. format('%d', precision) .. 'f' local success success, show = pcall(format, fmt, outvalue + fudge) if not success then return false, { 'cvt_big_prec', tostring(precision) } end else precision = -precision -- #digits to zero (in addition to any digits after dot) local shift = 10 ^ precision show = format('%.0f', outvalue/shift) if show ~= '0' then exponent = #show + precision end end end local t = format_number(parms, show, exponent, isnegative) if type(show) == 'string' then -- Set singular using match because on some systems 0.99999999999999999 is 1.0. if exponent then t.singular = (exponent == 1 and show:match('^10*$')) else t.singular = (show == '1' or show:match('^1%.0*$')) end else t.fraction_table = show t.singular = (outvalue <= 1) -- cannot have 'fraction == 1', but if it were possible it would be singular end t.raw_absvalue = outvalue -- absolute value before rounding return true, setmetatable(t, { __index = function (self, key) if key == 'absvalue' then -- Calculate absolute value after rounding, if needed. local clean, exponent = rawget(self, 'clean'), rawget(self, 'exponent') local value = tonumber(clean) -- absolute value (any negative sign has been ignored) if exponent then value = value * 10^exponent end rawset(self, key, value) return value end end }) end function cvt_to_hand(parms, info, in_current, out_current) -- Convert input to hands, inches. -- Return true, t where t is a table with the conversion results; -- or return false, t where t is an error message table. if parms.abbr_org == nil then out_current.usename = true -- default is to show name not symbol end local precision = parms.precision local frac = out_current.frac if not frac and precision and precision > 1 then frac = (precision == 2) and 2 or 4 end local out_next = out_current.out_next if out_next then -- Use magic knowledge to determine whether the next unit is inches without requiring i18n. -- The following ensures that when the output combination "hand in" is used, the inches -- value is rounded to match the hands value. Also, displaying say "61½" instead of 61.5 -- is better as 61.5 implies the value is not 61.4. if out_next.exception == 'subunit_more_precision' then out_next.frac = frac end end -- Convert to inches; calculate hands from that. local dummy_unit_table = { scale = out_current.scale / 4, frac = frac } local success, outinfo = cvtround(parms, info, in_current, dummy_unit_table) if not success then return false, outinfo end local tfrac = outinfo.fraction_table local inches = outinfo.raw_absvalue if tfrac then inches = floor(inches) -- integer part only; fraction added later else inches = floor(inches + 0.5) -- a hands measurement never shows decimals of an inch end local hands, inches = divide(inches, 4) outinfo.absvalue = hands + inches/4 -- supposed to be the absolute rounded value, but this is close enough local inchstr = tostring(inches) -- '0', '1', '2' or '3' if precision and precision <= 0 then -- using negative or 0 for precision rounds to nearest hand hands = floor(outinfo.raw_absvalue/4 + 0.5) inchstr = '' elseif tfrac then -- Always show an integer before fraction (like "15.0½") because "15½" means 15-and-a-half hands. inchstr = numdot .. format_fraction(parms, 'out', false, inchstr, tfrac.numstr, tfrac.denstr) else inchstr = numdot .. from_en(inchstr) end outinfo.show = outinfo.sign .. with_separator(parms, format('%.0f', hands)) .. inchstr return true, outinfo end local function evaluate_condition(value, condition) -- Return true or false from applying a conditional expression to value, -- or throw an error if invalid. -- A very limited set of expressions is supported: -- v < 9 -- v * 9 < 9 -- where -- 'v' is replaced with value -- 9 is any number (as defined by Lua tonumber) -- only en digits are accepted -- '<' can also be '<=' or '>' or '>=' -- In addition, the following form is supported: -- LHS and RHS -- where -- LHS, RHS = any of above expressions. local function compare(value, text) local arithop, factor, compop, limit = text:match('^%s*v%s*([*]?)(.-)([<>]=?)(.*)$') if arithop == nil then error('Invalid default expression', 0) elseif arithop == '*' then factor = tonumber(factor) if factor == nil then error('Invalid default expression', 0) end value = value * factor end limit = tonumber(limit) if limit == nil then error('Invalid default expression', 0) end if compop == '<' then return value < limit elseif compop == '<=' then return value <= limit elseif compop == '>' then return value > limit elseif compop == '>=' then return value >= limit end error('Invalid default expression', 0) -- should not occur end local lhs, rhs = condition:match('^(.-%W)and(%W.*)') if lhs == nil then return compare(value, condition) end return compare(value, lhs) and compare(value, rhs) end local function get_default(value, unit_table) -- Return true, s where s = name of unit's default output unit, -- or return false, t where t is an error message table. -- Some units have a default that depends on the input value -- (the first value if a range of values is used). -- If '!' is in the default, the first bang-delimited field is an -- expression that uses 'v' to represent the input value. -- Example: 'v < 120 ! small ! big ! suffix' (suffix is optional) -- evaluates 'v < 120' as a boolean with result -- 'smallsuffix' if (value < 120), or 'bigsuffix' otherwise. -- Input must use en digits and '.' decimal mark. local default = data_code.default_exceptions[unit_table.defkey or unit_table.symbol] or unit_table.default if not default then local per = unit_table.per if per then local function a_default(v, u) local success, ucode = get_default(v, u) if not success then return '?' -- an unlikely error has occurred; will cause lookup of default to fail end -- Attempt to use only the first unit if a combination or output multiple. -- This is not bulletproof but should work for most cases. -- Where it does not work, the convert will need to specify the wanted output unit. local t = all_units[ucode] if t then local combo = t.combination if combo then -- For a multiple like ftin, the "first" unit (ft) is last in the combination. local i = t.multiple and table_len(combo) or 1 ucode = combo[i] end else -- Try for an automatically generated combination. local item = ucode:match('^(.-)%+') or ucode:match('^(%S+)%s') if all_units[item] then return item end end return ucode end local unit1, unit2 = per[1], per[2] local def1 = (unit1 and a_default(value, unit1) or unit_table.vprefix or '') local def2 = a_default(1, unit2) -- 1 because per unit of denominator return true, def1 .. '/' .. def2 end return false, { 'cvt_no_default', unit_table.symbol } end if default:find('!', 1, true) == nil then return true, default end local t = split(default, '!') if #t == 3 or #t == 4 then local success, result = pcall(evaluate_condition, value, t[1]) if success then default = result and t[2] or t[3] if #t == 4 then default = default .. t[4] end return true, default end end return false, { 'cvt_bad_default', unit_table.symbol } end local linked_pages -- to record linked pages so will not link to the same page more than once local function unlink(unit_table) -- Forget that the given unit has previously been linked (if it has). -- That is needed when processing a range of inputs or outputs when an id -- for the first range value may have been evaluated, but only an id for -- the last value is displayed, and that id may need to be linked. linked_pages[unit_table.unitcode or unit_table] = nil end local function make_link(link, id, unit_table) -- Return wikilink "[[link|id]]", possibly abbreviated as in examples: -- [[Mile|mile]] --> [[mile]] -- [[Mile|miles]] --> [[mile]]s -- However, just id is returned if: -- * no link given (so caller does not need to check if a link was defined); or -- * link has previously been used during the current convert (to avoid overlinking). local link_key if unit_table then link_key = unit_table.unitcode or unit_table else link_key = link end if not link or link == '' or linked_pages[link_key] then return id end linked_pages[link_key] = true -- Following only works for language en, but it should be safe on other wikis, -- and overhead of doing it generally does not seem worthwhile. local l = link:sub(1, 1):lower() .. link:sub(2) if link == id or l == id then return '[[' .. id .. ']]' elseif link .. 's' == id or l .. 's' == id then return '[[' .. id:sub(1, -2) .. ']]s' else return '[[' .. link .. '|' .. id .. ']]' end end local function variable_name(clean, unit_table, exp_multiplier, key_id) -- A unit name may depend on the value in some languages. -- Parameter clean is the unsigned value in en digits, as a string. -- It may represent a number ("1.0") or a fraction ("1+2/3"). -- In varname, fields are separated with "!" and are not empty. -- A field for a unit using an SI prefix has the prefix name inserted, -- replacing '#' if found, or before the field otherwise. if clean:match('[./]') then -- float or fraction if exp_multiplier then clean = exp_multiplier -- force selection of name for a large integer else clean = 34.5 -- force selection of name for a float value end else clean = tonumber(clean) * (exp_multiplier or 1) end local name1, vname if key_id == 'pername' and unit_table.pername then vname = unit_table.pername elseif unit_table.varname then local splitvname = split(unit_table.varname, '!') name1 = unit_table.name1 vname = mw.language.getContentLanguage():convertPlural(clean, name1, unpack(splitvname)) else return clean == 1 and unit_table.name1 or unit_table.name2 end if vname == name1 then -- SI prefix (if any) has been inserted by unit_prefixed_mt. else local si_name = rawget(unit_table, 'si_name') or '' local pos = vname:find('#', 1, true) if pos then vname = vname:sub(1, pos - 1) .. si_name .. vname:sub(pos + 1) else vname = si_name .. vname end end return vname end local function linked_id(parms, unit_table, key_id, want_link, clean, exp_multiplier) -- Return final unit id (symbol or name), optionally with a wikilink, -- and update unit_table.sep if required. -- key_id is one of: 'symbol', 'sym_us', 'name1', 'name1_us', 'name2', 'name2_us', 'pername'. local abbr_on = (key_id == 'symbol' or key_id == 'sym_us') if abbr_on and want_link then local symlink = rawget(unit_table, 'symlink') if symlink then return symlink -- for exceptions that have the linked symbol built-in end end local multiplier = rawget(unit_table, 'multiplier') local per = unit_table.per if per then local paren1, paren2 = '', '' -- possible parentheses around bottom unit local unit1 = per[1] -- top unit_table, or nil local unit2 = per[2] -- bottom unit_table if abbr_on then if not unit1 then unit_table.sep = '' -- no separator in "$2/acre" end if not want_link then local symbol = unit_table.symbol_raw if symbol then return symbol -- for exceptions that have the symbol built-in end end if (unit2.symbol):find('⋅', 1, true) then paren1, paren2 = '(', ')' end end local key_id2 -- unit2 is always singular if key_id == 'name2' then key_id2 = 'name1' elseif key_id == 'name2_us' then key_id2 = 'name1_us' else key_id2 = key_id end if key_id2 == 'name1' or key_id2 == 'name1_us' then key_id2 = unit2.pername and 'pername' or key_id2 -- ukwiki has some units with a different name in "per unitname" end local result if abbr_on then result = '/' elseif omitsep then result = per_word elseif unit1 then result = ' ' .. per_word .. ' ' else result = per_word .. ' ' end if want_link and unit_table.link then if varname and not abbr_on then result = (unit1 and variable_name(clean, unit1, exp_multiplier) or '') .. result .. variable_name('1', unit2, exp_multiplier, key_id2) else result = (unit1 and linked_id(parms, unit1, key_id, false, clean) or '') .. result .. linked_id(parms, unit2, key_id2, false, '1') end if omit_separator(result) then unit_table.sep = '' end return make_link(unit_table.link, result, unit_table) end if unit1 then result = linked_id(parms, unit1, key_id, want_link, clean) .. result if unit1.sep then unit_table.sep = unit1.sep end elseif omitsep then unit_table.sep = '' end return result .. paren1 .. linked_id(parms, unit2, key_id2, want_link, '1') .. paren2 end if multiplier then -- A multiplier (like "100" in "100km") forces the unit to be plural. multiplier = from_en(multiplier) if not omitsep then multiplier = multiplier .. (abbr_on and '&nbsp;' or ' ') end if not abbr_on then if key_id == 'name1' then key_id = 'name2' elseif key_id == 'name1_us' then key_id = 'name2_us' end end else multiplier = '' end local id = unit_table.fixed_name or ((varname and not abbr_on) and variable_name(clean, unit_table, exp_multiplier, key_id) or unit_table[key_id]) if omit_separator(id) then unit_table.sep = '' end if want_link then local link = data_code.link_exceptions[unit_table.linkey or unit_table.symbol] or unit_table.link if link then local before = '' local i = unit_table.customary if i == 1 and parms.opt_sp_us then i = 2 -- show "U.S." not "US" end if i == 3 and abbr_on then i = 4 -- abbreviate "imperial" to "imp" end local customary = text_code.customary_units[i] if customary then -- LATER: This works for language en only, but it's esoteric so ignore for now. local pertext if id:sub(1, 1) == '/' then -- Want unit "/USgal" to display as "/U.S. gal", not "U.S. /gal". pertext = '/' id = id:sub(2) elseif id:sub(1, 4) == 'per ' then -- Similarly want "per U.S. gallon", not "U.S. per gallon" (but in practice this is unlikely to be used). pertext = 'per ' id = id:sub(5) else pertext = '' end -- Omit any "US"/"U.S."/"imp"/"imperial" from start of id since that will be inserted. local removes = (i < 3) and { 'US&nbsp;', 'US ', 'U.S.&nbsp;', 'U.S. ' } or { 'imp&nbsp;', 'imp ', 'imperial ' } for _, prefix in ipairs(removes) do local plen = #prefix if id:sub(1, plen) == prefix then id = id:sub(plen + 1) break end end before = pertext .. make_link(customary.link, customary[1]) .. ' ' end id = before .. make_link(link, id, unit_table) end end return multiplier .. id end local function make_id(parms, which, unit_table) -- Return id, f where -- id = unit name or symbol, possibly modified -- f = true if id is a name, or false if id is a symbol -- using the value for index 'which', and for 'in' or 'out' (unit_table.inout). -- Result is '' if no symbol/name is to be used. -- In addition, set unit_table.sep = ' ' or '&nbsp;' or '' -- (the separator that caller will normally insert before the id). if parms.opt_values then unit_table.sep = '' return '' end local inout = unit_table.inout local info = unit_table.valinfo[which] local lk = parms.lk local want_link = (lk == 'on' or lk == inout) local singular = info.singular local want_name local exp_multiplier if unit_table.usename then want_name = true else if parms.abbr_org == nil then if parms.wantname then want_name = true end if unit_table.usesymbol then want_name = false end end if want_name == nil then local abbr = parms.abbr if abbr == 'on' or abbr == inout or (abbr == 'mos' and inout == 'out') then want_name = false else want_name = true end end end local key if want_name then if lk == nil and unit_table.builtin == 'hand' then want_link = true end if parms.opt_use_nbsp then unit_table.sep = '&nbsp;' else unit_table.sep = ' ' end if parms.opt_singular then local value if inout == 'in' then value = info.value else value = info.absvalue end if value then -- some unusual units do not always set value field value = abs(value) singular = (0 < value and value < 1.0001) end end if unit_table.engscale then -- engscale: so "|1|e3kg" gives "1 thousand kilograms" (plural) singular = false exp_multiplier = 10^unit_table.engscale.exponent -- '1 gram' and '1 thousand grams', for example, may use different names for the unit in some languages end key = (parms.opt_adjectival or singular) and 'name1' or 'name2' if parms.opt_sp_us then key = key .. '_us' end else if unit_table.builtin == 'hand' then if parms.opt_hand_hh then unit_table.symbol = 'hh' -- LATER: might want i18n applied to this end end unit_table.sep = '&nbsp;' key = parms.opt_sp_us and 'sym_us' or 'symbol' end return linked_id(parms, unit_table, key, want_link, info.clean, exp_multiplier), want_name end local function decorate_value(parms, unit_table, which, enable_number_word) -- If needed, update unit_table so values will be shown with extra information. -- For consistency with the old template (but different from fmtpower), -- the style to display powers of 10 includes "display:none" to allow some -- browsers to copy, for example, "10³" as "10^3", rather than as "103". -- The engscale table may have entries such as either of the following: -- ["3"] = { "thousand", exponent = 3 }, -- ["3"] = { name1 = "A", varname = "B!C!D", exponent = 3 }, -- The first option always uses "thousand" as the exponent name. -- The second option uses one of A, B, C, D as the exponent name, depending on the value. local info local engscale = unit_table.engscale local prefix = unit_table.vprefix if engscale or prefix then info = unit_table.valinfo[which] if info.decorated then return -- do not redecorate if repeating convert end info.decorated = true if engscale then -- Range |10|-|20|e3km| gives '10×10³–20×10³' or '10–20 thousand'. local inout = unit_table.inout local abbr = parms.abbr if (abbr == 'on' or abbr == inout) and not (unit_table.this_number_word or parms.number_word) then info.show = info.show .. '<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' .. from_en('10') .. '</span></span><s style="display:none">^</s><sup>' .. from_en(tostring(engscale.exponent)) .. '</sup>' elseif enable_number_word then local number_id local name = engscale.varname and variable_name(info.clean, engscale) or engscale[1] if parms.lk == 'on' or parms.lk == inout then number_id = make_link(engscale.link, name) else number_id = name end -- WP:NUMERAL recommends "&nbsp;" in values like "12 million". info.show = info.show .. (parms.opt_adjectival and '-' or '&nbsp;') .. number_id end end if prefix then info.show = prefix .. info.show end end end local function process_input(parms, in_current) -- Processing required once per conversion. -- Return block of text to represent input (value/unit). if parms.opt_output_only or parms.opt_output_number_only or parms.opt_output_unit_only then parms.joins = { '', '' } return '' end local first_unit local composite = in_current.composite -- nil or table of units if composite then first_unit = composite[1] else first_unit = in_current end local id1, want_name = make_id(parms, 1, first_unit) local sep = first_unit.sep -- separator between value and unit, set by make_id local preunit = parms.preunit1 if preunit then sep = '' -- any separator is included in preunit else preunit = '' end if parms.opt_input_unit_only then parms.joins = { '', '' } if composite then local parts = { id1 } for i, unit in ipairs(composite) do if i > 1 then table.insert(parts, (make_id(parms, 1, unit))) end end id1 = table.concat(parts, ' ') end if want_name and parms.opt_adjectival then return preunit .. hyphenated(id1) end return preunit .. id1 end if parms.opt_also_symbol and not composite and not parms.opt_flip then local join1 = parms.joins[1] if join1 == ' (' or join1 == ' [' then parms.joins = { ' [' .. first_unit[parms.opt_sp_us and 'sym_us' or 'symbol'] .. ']' .. join1 , parms.joins[2] } end end if in_current.builtin == 'mach' and first_unit.sep ~= '' then -- '' means omitsep with non-enwiki name local prefix = id1 .. '&nbsp;' local range = parms.range local valinfo = first_unit.valinfo local result = prefix .. valinfo[1].show if range then -- For simplicity and because more not needed, handle one range item only. local prefix2 = make_id(parms, 2, first_unit) .. '&nbsp;' result = range_text(range[1], want_name, parms, result, prefix2 .. valinfo[2].show, 'in', {spaced=true}) end return preunit .. result end if composite then -- Simplify: assume there is no range, and no decoration. local mid = (not parms.opt_flip) and parms.mid or '' local sep1 = '&nbsp;' local sep2 = ' ' if parms.opt_adjectival and want_name then sep1 = '-' sep2 = '-' end if omitsep and sep == '' then -- Testing the id of the most significant unit should be sufficient. sep1 = '' sep2 = '' end local parts = { first_unit.valinfo[1].show .. sep1 .. id1 } for i, unit in ipairs(composite) do if i > 1 then table.insert(parts, unit.valinfo[1].show .. sep1 .. (make_id(parms, 1, unit))) end end return table.concat(parts, sep2) .. mid end local add_unit = (parms.abbr == 'mos') or parms[parms.opt_flip and 'out_range_x' or 'in_range_x'] or (not want_name and parms.abbr_range_x) local range = parms.range if range and not add_unit then unlink(first_unit) end local id = range and make_id(parms, range.n + 1, first_unit) or id1 local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, 'in') if was_hyphenated then add_unit = false end local result local valinfo = first_unit.valinfo if range then for i = 0, range.n do local enable_number_word if i == range.n then add_unit = false enable_number_word = true end decorate_value(parms, first_unit, i+1, enable_number_word) local show = valinfo[i+1].show if add_unit then show = show .. first_unit.sep .. (i == 0 and id1 or make_id(parms, i+1, first_unit)) end if i == 0 then result = show else result = range_text(range[i], want_name, parms, result, show, 'in') end end else decorate_value(parms, first_unit, 1, true) result = valinfo[1].show end return result .. preunit .. extra end local function process_one_output(parms, out_current) -- Processing required for each output unit. -- Return block of text to represent output (value/unit). local inout = out_current.inout -- normally 'out' but can be 'in' for order=out local id1, want_name = make_id(parms, 1, out_current) local sep = out_current.sep -- set by make_id local preunit = parms.preunit2 if preunit then sep = '' -- any separator is included in preunit else preunit = '' end if parms.opt_output_unit_only then if want_name and parms.opt_adjectival then return preunit .. hyphenated(id1) end return preunit .. id1 end if out_current.builtin == 'mach' and out_current.sep ~= '' then -- '' means omitsep with non-enwiki name local prefix = id1 .. '&nbsp;' local range = parms.range local valinfo = out_current.valinfo local result = prefix .. valinfo[1].show if range then -- For simplicity and because more not needed, handle one range item only. result = range_text(range[1], want_name, parms, result, prefix .. valinfo[2].show, inout, {spaced=true}) end return preunit .. result end local add_unit = (parms[parms.opt_flip and 'in_range_x' or 'out_range_x'] or (not want_name and parms.abbr_range_x)) and not parms.opt_output_number_only local range = parms.range if range and not add_unit then unlink(out_current) end local id = range and make_id(parms, range.n + 1, out_current) or id1 local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, inout) if was_hyphenated then add_unit = false end local result local valinfo = out_current.valinfo if range then for i = 0, range.n do local enable_number_word if i == range.n then add_unit = false enable_number_word = true end decorate_value(parms, out_current, i+1, enable_number_word) local show = valinfo[i+1].show if add_unit then show = show .. out_current.sep .. (i == 0 and id1 or make_id(parms, i+1, out_current)) end if i == 0 then result = show else result = range_text(range[i], want_name, parms, result, show, inout) end end else decorate_value(parms, out_current, 1, true) result = valinfo[1].show end if parms.opt_output_number_only then return result end return result .. preunit .. extra end local function make_output_single(parms, in_unit_table, out_unit_table) -- Return true, item where item = wikitext of the conversion result -- for a single output (which is not a combination or a multiple); -- or return false, t where t is an error message table. if parms.opt_order_out and in_unit_table.unitcode == out_unit_table.unitcode then out_unit_table.valinfo = in_unit_table.valinfo else out_unit_table.valinfo = collection() for _, v in ipairs(in_unit_table.valinfo) do local success, info = cvtround(parms, v, in_unit_table, out_unit_table) if not success then return false, info end out_unit_table.valinfo:add(info) end end return true, process_one_output(parms, out_unit_table) end local function make_output_multiple(parms, in_unit_table, out_unit_table) -- Return true, item where item = wikitext of the conversion result -- for an output which is a multiple (like 'ftin'); -- or return false, t where t is an error message table. local inout = out_unit_table.inout -- normally 'out' but can be 'in' for order=out local multiple = out_unit_table.multiple -- table of scaling factors (will not be nil) local combos = out_unit_table.combination -- table of unit tables (will not be nil) local abbr = parms.abbr local abbr_org = parms.abbr_org local disp = parms.disp local want_name = (abbr_org == nil and (disp == 'or' or disp == 'slash')) or not (abbr == 'on' or abbr == inout or abbr == 'mos') local want_link = (parms.lk == 'on' or parms.lk == inout) local mid = parms.opt_flip and parms.mid or '' local sep1 = '&nbsp;' local sep2 = ' ' if parms.opt_adjectival and want_name then sep1 = '-' sep2 = '-' end local do_spell = parms.opt_spell_out parms.opt_spell_out = nil -- so the call to cvtround does not spell the value local function make_result(info, isfirst) local fmt, outvalue, sign local results = {} for i = 1, #combos do local tfrac, thisvalue, strforce local out_current = combos[i] out_current.inout = inout local scale = multiple[i] if i == 1 then -- least significant unit ('in' from 'ftin') local decimals out_current.frac = out_unit_table.frac local success, outinfo = cvtround(parms, info, in_unit_table, out_current) if not success then return false, outinfo end if isfirst then out_unit_table.valinfo = { outinfo } -- in case output value of first least significant unit is needed end sign = outinfo.sign tfrac = outinfo.fraction_table if outinfo.is_scientific then strforce = outinfo.show decimals = '' elseif tfrac then decimals = '' else local show = outinfo.show -- number as a string in local language local p1, p2 = show:find(numdot, 1, true) decimals = p1 and show:sub(p2 + 1) or '' -- text after numdot, if any end fmt = '%.' .. ulen(decimals) .. 'f' -- to reproduce precision if decimals == '' then if tfrac then outvalue = floor(outinfo.raw_absvalue) -- integer part only; fraction added later else outvalue = floor(outinfo.raw_absvalue + 0.5) -- keep all integer digits of least significant unit end else outvalue = outinfo.absvalue end end if scale then outvalue, thisvalue = divide(outvalue, scale) else thisvalue = outvalue end local id if want_name then if varname then local clean if strforce or tfrac then clean = '.1' -- dummy value to force name for floating point else clean = format(fmt, thisvalue) end id = variable_name(clean, out_current) else local key = 'name2' if parms.opt_adjectival then key = 'name1' elseif tfrac then if thisvalue == 0 then key = 'name1' end elseif parms.opt_singular then if 0 < thisvalue and thisvalue < 1.0001 then key = 'name1' end else if thisvalue == 1 then key = 'name1' end end id = out_current[key] end else id = out_current['symbol'] end if i == 1 and omit_separator(id) then -- Testing the id of the least significant unit should be sufficient. sep1 = '' sep2 = '' end if want_link then local link = out_current.link if link then id = make_link(link, id, out_current) end end local strval local spell_inout = (i == #combos or outvalue == 0) and inout or '' -- trick so the last value processed (first displayed) has uppercase, if requested if strforce and outvalue == 0 then sign = '' -- any sign is in strforce strval = strforce -- show small values in scientific notation; will only use least significant unit elseif tfrac then local wholestr = (thisvalue > 0) and tostring(thisvalue) or nil strval = format_fraction(parms, spell_inout, false, wholestr, tfrac.numstr, tfrac.denstr, do_spell) else strval = (thisvalue == 0) and from_en('0') or with_separator(parms, format(fmt, thisvalue)) if do_spell then strval = spell_number(parms, spell_inout, strval) or strval end end table.insert(results, strval .. sep1 .. id) if outvalue == 0 then break end fmt = '%.0f' -- only least significant unit can have a non-integral value end local reversed, count = {}, #results for i = 1, count do reversed[i] = results[count + 1 - i] end return true, sign .. table.concat(reversed, sep2) end local valinfo = in_unit_table.valinfo local success, result = make_result(valinfo[1], true) if not success then return false, result end local range = parms.range if range then for i = 1, range.n do local success, result2 = make_result(valinfo[i+1]) if not success then return false, result2 end result = range_text(range[i], want_name, parms, result, result2, inout, {spaced=true}) end end return true, result .. mid end local function process(parms, in_unit_table, out_unit_table) -- Return true, s, outunit where s = final wikitext result, -- or return false, t where t is an error message table. linked_pages = {} local success, bad_output local bad_input_mcode = in_unit_table.bad_mcode -- nil if input unit is a valid convert unit local out_unit = parms.out_unit if out_unit == nil or out_unit == '' or type(out_unit) == 'function' then -- out_unit can be set to a function by adjustparameters in Module:Convert/wikidata. if bad_input_mcode or parms.opt_input_unit_only then bad_output = '' else local getdef = type(out_unit) == 'function' and out_unit or get_default success, out_unit = getdef(in_unit_table.valinfo[1].value, in_unit_table) parms.out_unit = out_unit if not success then bad_output = out_unit end end end if not bad_output and not out_unit_table then success, out_unit_table = lookup(parms, out_unit, 'any_combination') if success then local mismatch = check_mismatch(in_unit_table, out_unit_table) if mismatch then bad_output = mismatch end else bad_output = out_unit_table end end local lhs, rhs local flipped = parms.opt_flip and not bad_input_mcode if bad_output then rhs = (bad_output == '') and '' or message(parms, bad_output) elseif parms.opt_input_unit_only then rhs = '' else local combos -- nil (for 'ft' or 'ftin'), or table of unit tables (for 'm ft') if not out_unit_table.multiple then -- nil/false ('ft' or 'm ft'), or table of factors ('ftin') combos = out_unit_table.combination end local frac = parms.frac -- nil or denominator of fraction for output values if frac then -- Apply fraction to the unit (if only one), or to non-SI units (if a combination), -- except that if a precision is also specified, the fraction only applies to -- the hand unit; that allows the following result: -- {{convert|156|cm|in hand|1|frac=2}} → 156 centimetres (61.4 in; 15.1½ hands) -- However, the following is handled elsewhere as a special case: -- {{convert|156|cm|hand in|1|frac=2}} → 156 centimetres (15.1½ hands; 61½ in) if combos then local precision = parms.precision for _, unit in ipairs(combos) do if unit.builtin == 'hand' or (not precision and not unit.prefixes) then unit.frac = frac end end else out_unit_table.frac = frac end end local outputs = {} local imax = combos and #combos or 1 -- 1 (single unit) or number of unit tables if imax == 1 then parms.opt_order_out = nil -- only useful with an output combination end if not flipped and not parms.opt_order_out then -- Process left side first so any duplicate links (from lk=on) are suppressed -- on right. Example: {{convert|28|e9pc|e9ly|abbr=off|lk=on}} lhs = process_input(parms, in_unit_table) end for i = 1, imax do local success, item local out_current = combos and combos[i] or out_unit_table out_current.inout = 'out' if i == 1 then if imax > 1 and out_current.builtin == 'hand' then out_current.out_next = combos[2] -- built-in hand can influence next unit in a combination end if parms.opt_order_out then out_current.inout = 'in' end end if out_current.multiple then success, item = make_output_multiple(parms, in_unit_table, out_current) else success, item = make_output_single(parms, in_unit_table, out_current) end if not success then return false, item end outputs[i] = item end if parms.opt_order_out then lhs = outputs[1] table.remove(outputs, 1) end local sep = parms.table_joins and parms.table_joins[2] or parms.join_between rhs = table.concat(outputs, sep) end if flipped or not lhs then local input = process_input(parms, in_unit_table) if flipped then lhs = rhs rhs = input else lhs = input end end if parms.join_before then lhs = parms.join_before .. lhs end local wikitext if bad_input_mcode then if bad_input_mcode == '' then wikitext = lhs else wikitext = lhs .. message(parms, bad_input_mcode) end elseif parms.table_joins then wikitext = parms.table_joins[1] .. lhs .. parms.table_joins[2] .. rhs else wikitext = lhs .. parms.joins[1] .. rhs .. parms.joins[2] end if parms.warnings and not bad_input_mcode then wikitext = wikitext .. parms.warnings end return true, get_styles(parms) .. wikitext, out_unit_table end local function _main_convert(confArgs, parmsArgs, frame) -- Do convert, and if needed, do it again with higher default precision. local parms = { frame = frame or mw.getCurrentFrame() } -- will hold template arguments, after translation set_config(confArgs) local success, result = get_parms(parms, parmsArgs) if success then if type(result) ~= 'table' then return tostring(result) end local in_unit_table = result local out_unit_table for _ = 1, 2 do -- use counter so cannot get stuck repeating convert success, result, out_unit_table = process(parms, in_unit_table, out_unit_table) if success and parms.do_convert_again then parms.do_convert_again = false else break end end end -- If input=x gives a problem, the result should be just the user input -- (if x is a property like P123 it has been replaced with ''). -- An unknown input unit would display the input and an error message -- with success == true at this point. -- Also, can have success == false with a message that outputs an empty string. if parms.input_text then if success and not parms.have_problem then return result end local cat if parms.tracking then -- Add a tracking category using the given text as the category sort key. -- There is currently only one type of tracking, but in principle multiple -- items could be tracked, using different sort keys for convenience. cat = wanted_category('tracking', parms.tracking) end return parms.input_text .. (cat or '') end return success and result or message(parms, result) end local function main_convert(frame) return _main_convert(frame.args, frame:getParent().args, frame) end local function _unit(unitcode, options) -- Helper function for Module:Val to look up a unit. -- Parameter unitcode must be a string to identify the wanted unit. -- Parameter options must be nil or a table with optional fields: -- value = number (for sort key; default value is 1) -- scaled_top = nil for a normal unit, or a number for a unit which is -- the denominator of a per unit (for sort key) -- si = { 'symbol', 'link' } -- (a table with two strings) to make an SI unit -- that will be used for the look up -- link = true if result should be [[linked]] -- sort = 'on' or 'debug' if result should include a sort key in a -- span element ('debug' makes the key visible) -- name = true for the name of the unit instead of the symbol -- us = true for the US spelling of the unit, if any -- Return nil if unitcode is not a non-empty string. -- Otherwise return a table with fields: -- text = requested symbol or name of unit, optionally linked -- scaled_value = input value adjusted by unit scale; used for sort key -- sortspan = span element with sort key like that provided by {{ntsh}}, -- calculated from the result of converting value -- to a base unit with scale 1. -- unknown = true if the unitcode was not known unitcode = strip(unitcode) if unitcode == nil or unitcode == '' then return nil end set_config({}) linked_pages = {} options = options or {} local parms = { abbr = options.name and 'off' or 'on', lk = options.link and 'on' or nil, opt_sp_us = options.us and true or nil, opt_ignore_error = true, -- do not add pages using this function to 'what links here' for Module:Convert/extra opt_sortable_on = options.sort == 'on' or options.sort == 'debug', opt_sortable_debug = options.sort == 'debug', } if options.si then -- Make a dummy table of units (just one unit) for lookup to use. -- This makes lookup recognize any SI prefix in the unitcode. local symbol = options.si[1] or '?' parms.unittable = { [symbol] = { _name1 = symbol, _name2 = symbol, _symbol = symbol, utype = symbol, scale = symbol == 'g' and 0.001 or 1, prefixes = 1, default = symbol, link = options.si[2], }} end local success, unit_table = lookup(parms, unitcode, 'no_combination') if not success then unit_table = setmetatable({ symbol = unitcode, name2 = unitcode, utype = unitcode, scale = 1, default = '', defkey = '', linkey = '' }, unit_mt) end local value = tonumber(options.value) or 1 local clean = tostring(abs(value)) local info = { value = value, altvalue = value, singular = (clean == '1'), clean = clean, show = clean, } unit_table.inout = 'in' unit_table.valinfo = { info } local sortspan, scaled_value if options.sort then sortspan, scaled_value = make_table_or_sort(parms, value, info, unit_table, options.scaled_top) end return { text = make_id(parms, 1, unit_table), sortspan = sortspan, scaled_value = scaled_value, unknown = not success and true or nil, } end return { convert = main_convert, _convert = _main_convert, _unit = _unit } 84ef1800df9ddbc24da3d295d74282d1c59ec2b5 Captain Yulia 0 742 1144 2025-08-06T13:05:28Z Sharparam 284703 Redirected page to [[Royal Division Captain Yulia]] wikitext text/x-wiki #REDIRECT [[Royal Division Captain Yulia]] 944a6e86bec704d704b6109fc690822aa40d60b9 Vermillion Mirage 0 753 1166 2025-08-06T13:05:55Z Sharparam 284703 Redirected page to [[Royal Division Captain Yulia & Vermillion Mirage]] wikitext text/x-wiki #REDIRECT [[Royal Division Captain Yulia & Vermillion Mirage]] a706f52584d29641b5b3d4ebd9403828f396a0e3 Royal Division Captain Yulia & Vermillion Mirage 0 551 862 2025-08-06T13:16:49Z Sharparam 284703 Update entropy gain description wikitext text/x-wiki {{Infobox/Boss | image = Final boss.png }} '''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}. == Overview == When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar. After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them. Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death. Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player. Defeating the boss will immediately trigger the [[Endings|ending]] cutscene. After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game. == Location == Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top. {{Navbox/Bosses}} [[Category:Pages that need coordinates]] dfff03fcfd660a270e379514af4cb192c6e3d589 Entropy 0 709 1084 2025-08-06T13:17:41Z Sharparam 284703 Update description for final boss wikitext text/x-wiki '''{{PAGENAME}}''' is a property of the player in {{BFF}}. == Overview == Entropy can only be gained from a few sources. * Dying to a [[Vermillion Knight]] increases entropy by 0.25%. * Dying during phase 2 of the [[Royal Division Captain Yulia & Vermillion Mirage]] boss fight (after Yulia joins the fight) increases entropy by 0.5%. Upon reaching 100% entropy, the player's save file is deleted. [[Category:Game mechanics]] cda5c4f1fca74bd5447670462ba15ebe07df0b38 Template:Infobox/Weapon 10 451 666 2025-08-19T02:14:26Z Sharparam 284703 Fix typo wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | ranged = [[Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 6ed81445f4e99c129429ea030ff07667c32cc439 Main Page 0 1 1 2025-08-20T01:22:19Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Bleak Faith: Forsaken Wiki]] cbeda71f0e01355547a440cf49c164ea0bce9014 2 1 2025-08-20T01:22:20Z ARTIFICER 564804 Protected "[[Main Page]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki #redirect [[Bleak Faith: Forsaken Wiki]] cbeda71f0e01355547a440cf49c164ea0bce9014 Bleak Faith: Forsaken Wiki 0 2 3 2025-08-20T01:22:20Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <!-- Hello and welcome to wiki.gg! This page is built via our IMProved Main Page (IMP) framework. If you are familiar with CSS grid areas, that's what you're defining here! But if you don't know any CSS that's ok! 👀 RULE 1: the same keyword represents the same section & can span multiple cells 👀 RULE 2: Each box in each layout must be a CONTIGUOUS RECTANGLE of any dimensions (most likely one of: 1x1, 1x2, 2x1, 2x2, 1x3, 3x1, 3x2, 2x3) 👀 RULE 3: This page defines LAYOUT ONLY. To edit the content, please use the links provided for you after saving/previewing your page. 👀 RULE 4: If you want to RENAME or ADD a box, (1) add a new section to the grid layout below (all three breakpoints!) and then (2) save or preview this page and then (3) click "Create this box" -->{{Main page |desktop= <!-- for WIDE SCREENS --> <!-- 👀 keep this at 3 columns, but you can otherwise rearrange as desired --> welcome welcome welcome about pages pages contribute contribute external <!-- end WIDE SCREEN layout --> |tablet= <!-- for TABLET SCREENS --> <!-- 👀 keep this at 2 columns, but you can otherwise rearrange as desired --> welcome welcome about pages contribute external <!-- end TABLET SCREEN layout --> |mobile= <!-- for MOBILE DEVICES --> <!-- 👀 keep this at 1 column, but you can otherwise rearrange as desired --> welcome about pages external contribute <!-- end MOBILE DEVICE layout --> }} {{#description2:Welcome to the {{SITENAME}}, a collaborative wiki resource that is open for anyone to edit!}} <!-- this is a short description of your wiki, which will appear in embeds in Google search results, Discord links, etc. --> c5d4351377806d884e84bc34774f85fd4a425e0a 4 3 2025-08-20T01:22:21Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <!-- Hello and welcome to wiki.gg! This page is built via our IMProved Main Page (IMP) framework. If you are familiar with CSS grid areas, that's what you're defining here! But if you don't know any CSS that's ok! 👀 RULE 1: the same keyword represents the same section & can span multiple cells 👀 RULE 2: Each box in each layout must be a CONTIGUOUS RECTANGLE of any dimensions (most likely one of: 1x1, 1x2, 2x1, 2x2, 1x3, 3x1, 3x2, 2x3) 👀 RULE 3: This page defines LAYOUT ONLY. To edit the content, please use the links provided for you after saving/previewing your page. 👀 RULE 4: If you want to RENAME or ADD a box, (1) add a new section to the grid layout below (all three breakpoints!) and then (2) save or preview this page and then (3) click "Create this box" -->{{Main page |desktop= <!-- for WIDE SCREENS --> <!-- 👀 keep this at 3 columns, but you can otherwise rearrange as desired --> welcome welcome welcome about pages pages contribute contribute external <!-- end WIDE SCREEN layout --> |tablet= <!-- for TABLET SCREENS --> <!-- 👀 keep this at 2 columns, but you can otherwise rearrange as desired --> welcome welcome about pages contribute external <!-- end TABLET SCREEN layout --> |mobile= <!-- for MOBILE DEVICES --> <!-- 👀 keep this at 1 column, but you can otherwise rearrange as desired --> welcome about pages external contribute <!-- end MOBILE DEVICE layout --> }} {{#description2:Welcome to the {{SITENAME}}, a collaborative wiki resource that is open for anyone to edit!}} <!-- this is a short description of your wiki, which will appear in embeds in Google search results, Discord links, etc. --> c5d4351377806d884e84bc34774f85fd4a425e0a Bleak Faith: Forsaken Wiki/welcome 0 4 6 2025-08-20T01:22:22Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = Welcome to the {{SITENAME}}! }} We are currently maintaining [[Special:AllPages|{{NUMBEROFARTICLES}} articles]]. Please feel free to contribute by creating new articles or expanding existing ones. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 96df981ef23fca9434d1586228cab8a51e0fdc0a 7 6 2025-08-20T01:22:22Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki/welcome]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{Main page box/start | title = Welcome to the {{SITENAME}}! }} We are currently maintaining [[Special:AllPages|{{NUMBEROFARTICLES}} articles]]. Please feel free to contribute by creating new articles or expanding existing ones. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 96df981ef23fca9434d1586228cab8a51e0fdc0a Bleak Faith: Forsaken Wiki/pages 0 5 8 2025-08-20T01:22:22Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Important page here|image=Wiki.gg logo-pink.svg|size=92px}} * {{MP link|Random page|link=Special:Random}} * {{MP link|Example character|link=Example character|image=Example_character_image.png|size=92px}} * {{MP link|Example character infobox|link=Template:Example character infobox|image=Example_character_image.png|size=92px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 827f14b4cd3d346ca427f95e9574fc23c4874206 9 8 2025-08-20T01:22:23Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki/pages]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Important page here|image=Wiki.gg logo-pink.svg|size=92px}} * {{MP link|Random page|link=Special:Random}} * {{MP link|Example character|link=Example character|image=Example_character_image.png|size=92px}} * {{MP link|Example character infobox|link=Template:Example character infobox|image=Example_character_image.png|size=92px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 827f14b4cd3d346ca427f95e9574fc23c4874206 Bleak Faith: Forsaken Wiki/about 0 6 10 2025-08-20T01:22:23Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = About Bleak Faith: Forsaken }} This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration! <div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> d5a0888496afa538312e1253db527add7089b342 11 10 2025-08-20T01:22:24Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki/about]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{Main page box/start | title = About Bleak Faith: Forsaken }} This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration! <div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> d5a0888496afa538312e1253db527add7089b342 Bleak Faith: Forsaken Wiki/contribute 0 7 12 2025-08-20T01:22:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = Contribute to the wiki }} {{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players. ; Adding content :* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done. :* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough. :* [[Special:UserLogin/signup|Register]] to edit and track your contributions. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 8b79debc73480ec2b12cb5e39723b94532fd44bd 13 12 2025-08-20T01:22:24Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki/contribute]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{Main page box/start | title = Contribute to the wiki }} {{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players. ; Adding content :* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done. :* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough. :* [[Special:UserLogin/signup|Register]] to edit and track your contributions. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 8b79debc73480ec2b12cb5e39723b94532fd44bd Bleak Faith: Forsaken Wiki/external 0 8 14 2025-08-20T01:22:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = External links }} <div class="mp-links columns-2"> * {{MP link|Official site|link=https://wiki.gg}} * {{MP link|Discord|link=https://discord.gg/rTnST57tuW|image=Discord.svg|size=64x64px}} * {{MP link|Bluesky|link=https://bsky.app/profile/wiki.gg|image=Bluesky.svg|size=64x64px}} * {{MP link|indie.io|link=https://www.indie.io/|image=indie.io.svg|size=64x64px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> bb8190c57bb4cc147764d1c10f218fe4d34e0a49 15 14 2025-08-20T01:22:25Z ARTIFICER 564804 Protected "[[Bleak Faith: Forsaken Wiki/external]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{Main page box/start | title = External links }} <div class="mp-links columns-2"> * {{MP link|Official site|link=https://wiki.gg}} * {{MP link|Discord|link=https://discord.gg/rTnST57tuW|image=Discord.svg|size=64x64px}} * {{MP link|Bluesky|link=https://bsky.app/profile/wiki.gg|image=Bluesky.svg|size=64x64px}} * {{MP link|indie.io|link=https://www.indie.io/|image=indie.io.svg|size=64x64px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> bb8190c57bb4cc147764d1c10f218fe4d34e0a49 Meta:Default Loadout Wiki:Copyrights 4 9 16 2025-08-20T01:22:26Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <!--''[[GAME]]'' content and materials are the intellectual property of their respective owners. -->Content that you make available on {{SITENAME}} is licensed by you to us under our [{{int:wikigg-tos-url}} Terms of Service]. Do not make content available on {{SITENAME}} where you do not have the necessary rights to grant this license. All textual and graphical content on {{SITENAME}} that we may lawfully license is licensed to you under the [https://creativecommons.org/licenses/by-sa/4.0 Creative Commons Attribution-ShareAlike 4.0] license. [[Category:Legal notices]] a5c705cf276359aef94d426ee75d18bbf1e361ac 17 16 2025-08-20T01:22:26Z ARTIFICER 564804 Protected "[[Meta:Default Loadout Wiki:Copyrights]]" ([Edit=Allow only administrators] (indefinite)) wikitext text/x-wiki <!--''[[GAME]]'' content and materials are the intellectual property of their respective owners. -->Content that you make available on {{SITENAME}} is licensed by you to us under our [{{int:wikigg-tos-url}} Terms of Service]. Do not make content available on {{SITENAME}} where you do not have the necessary rights to grant this license. All textual and graphical content on {{SITENAME}} that we may lawfully license is licensed to you under the [https://creativecommons.org/licenses/by-sa/4.0 Creative Commons Attribution-ShareAlike 4.0] license. [[Category:Legal notices]] a5c705cf276359aef94d426ee75d18bbf1e361ac Module:Infobox 828 10 18 2025-08-20T01:22:26Z ARTIFICER 564804 Importing default loadout Scribunto text/plain -- version 0.1.7 -------------------------------------- -- User settings, you can modify these -------------------------------------- -- if you want to not always use divs in your wiki (as opposed to tables), you can change this default -- just remember to change it back each time you update from the main "branch" on the support wiki! -- you can also control it per infobox with `|useDivs=yes` or `|useDivs=no` local USE_DIVS = true -- `false` or `true` -- default value to show if a param is missing in some but not all tabs. -- set to `nil` (not in quotes) to remove such rows altogether in the tabs where they're missing local TABBED_NONEXIST = nil -- `''` or `nil` or `'N/A'` etc. Don't put nil in quotes. --------------------------------------------------------------------------- -- Do not modify anything below this line unless you know what you're doing --------------------------------------------------------------------------- local h = {} local p = {} local hooks = {} function p.arraymap(frame) -- a lua implementation of Page Forms' arraymap local args = h.overwrite() local items = h.split(args[1], args[2] or ',') for i, item in ipairs(items) do items[i] = args[4]:gsub(args[3], item) end return table.concat(items, args[5] or ',') end function p.preprocess(frame) return frame:preprocess(frame.args[1] or frame:getParent().args[1]) end function p.main(frame) h.registerHooks() h.increment() local args = h.overwrite() local sep = args.sep or ',' h.castArgs(args, sep) if h.castBool(args.setmainimage or 'yes') then h.setMainImage(args.images[1]) end -- suggest to use HIDDENCAT here; will be used for maintenance & gadget imports return h.makeInfobox(args, sep), '[[Category:Pages with DRUID infoboxes]]' end function h.registerHooks() if not mw.title.new('Module:Infobox/Hooks').exists then return end hooks = require('Module:Infobox/Hooks') end function h.runHook(key, ...) if hooks[key] then hooks[key](...) end end function h.increment() -- optional use of VariablesLua for better compatibility local VariablesLua = mw.ext.VariablesLua if VariablesLua == nil then local res -- try to fall back to normal Variables res, h.counter = pcall( function() return mw.getCurrentFrame():callParserFunction('#var', {'DRUID_INFOBOX_ID', 0}) + 1 end ) if res then mw.getCurrentFrame():callParserFunction('#vardefine', {'DRUID_INFOBOX_ID', h.counter}) else -- else use a random number so at least there's some unique id h.counter = math.random(100000000000000000) -- random integer end else h.counter = VariablesLua.var('DRUID_INFOBOX_ID', 0) + 1 VariablesLua.vardefine('DRUID_INFOBOX_ID', h.counter) end end function h.castArgs(args, sep) h.runHook('onCastArgsStart', args, sep, args.kind) args.tabs = h.split(args.tabs or args.image_labels, sep) args.images = h.getImages(args, sep) args.sections = h.split(args.sections, sep) for _, section in ipairs(args.sections) do if h.castBool(args[section .. '_isdata']) then args[section .. 'Data'] = args[section] args[section] = section .. 'Data' args[section .. 'Data_nolabel'] = 'true' -- will be cast later end args[section] = h.split(args[section], sep) args[section .. '_tabs'] = h.split(args[section .. '_tabs'], sep) if #args.tabs > 0 and #args[section .. '_tabs'] > 0 then error(('You cannot specify |tabs= and |%s= at the same time, please pick one'):format(section .. '_tabs')) end end if args.useDivs then USE_DIVS = h.castBool(args.useDivs) end -- this would be in the outer scope, but we're hiding it h.entityType = USE_DIVS and 'div' or 'table' -- key of h.htmlEntities h.runHook('onCastArgsEnd', args, sep, args.kind) end function h.getImages(args, sep) if args.image and not args.images then args.images = args.image end if args.images then return h.split(args.images, sep) end if not args.tabs then return {} end local ret = {} for _, key in ipairs(args.tabs) do if args[key .. '_image'] then ret[#ret+1] = args[key .. '_image'] end end return ret end function h.setMainImage(file) if h.counter > 1 then return end if not file then return end local fileText = file:gsub('.-:', '') fileText = fileText:gsub('^([^|%]]+).*', '%1') -- setmainimage is guaranteed to exist on wiki.gg but may not exist on other wikis -- it's not a crucial piece of functionality so we'll fail silently if it doesn't exist pcall(function() mw.getCurrentFrame():callParserFunction{ name = '#setmainimage', args = { fileText }, } end) end function h.makeInfobox(args, sep) local out = mw.html.create(h.getTag('container')) :addClass('druid-infobox') :addClass('druid-container') :addClass('noexcerpt') :addClass(args.class) -- warning: class can be nil, don't concat anything :attr('id', args.id or ('druid-container-' .. h.counter)) h.runHook('onMakeOutputStart', out, args) if args.kind then out:addClass('druid-container-' .. h.escape(args.kind)) end h.printTitle(out, args) h.printImages(out, args.images, args) for _, section in ipairs(args.sections) do -- cannot begin tagging here because we don't know if any applicable args are present local cols = args[section .. '_columns'] local makeSection = cols and h.makeGridSection or h.makeSection out:node(makeSection(section, args[section], args, tonumber(cols))) end h.runHook('onMakeOutputEnd', out, args) -- category for gadget loading return out, '[[Category:Pages with DRUID infoboxes]]' end function h.printTitle(out, args) local tabs = args.tabs if not tabs or #tabs == 0 then h.printSimpleTitle(out, args) return end if not h.hasComplexData('title', tabs, args) then h.printSimpleTitle(out, args) return end local node = h.printTitleWrapper(out) h.printTabbedDataItem(node, 'title', tabs, args) end function h.printSimpleTitle(out, args) if args.title then local node = h.printTitleWrapper(out) node:wikitext(args.title) end end function h.printTitleWrapper(out) return out:tag(h.getTag('titleOuter')) :tag(h.getTag('titleInner')) :addClass('druid-title') :attr('colspan', 2) end function h.printTabbedDataItem(node, item, tabs, args) -- hasData isn't used in the title case but we will need to track this -- when we're printing section data later on -- so we'll just track it always local hasData = false for i, label in ipairs(tabs) do local div = node:tag('div') :addClass('druid-toggleable-data') :addClass('druid-toggleable') :attr('data-druid', h.counter .. '-' .. i) :attr('data-druid-tab-key', label) if h.getTabbedContent(args, label, item) then hasData = true div:wikitext('\n\n' .. h.getTabbedContent(args, label, item)) div:addClass('druid-toggleable-data-nonempty') else div:addClass('druid-toggleable-data-empty') end if i == 1 then div:addClass('focused') end end return hasData end function h.printImages(out, images, args) if #images == 0 and #args.tabs == 0 then return end -- burden is on the user to format this as an image. this should be done in the infobox template, -- with something like |image={{#if:{{{image|}}}|[[File:{{{image|}}}{{!}}300px{{!}}link=]]}} local td = out:tag(h.getTag('section')) :addClass('druid-section-container') :tag(h.getTag('cell')) :attr('colspan', 2) local tabs = args.tabs local tabTexts = h.getImageTabTexts(tabs, images, args) h.printTabs(td, tabs, tabTexts, false, args) if #images == 0 then return end if #images == 1 then td:addClass('druid-main-image') :wikitext(images[1]) if args.caption then td:tag('div') :addClass('druid-main-image-caption') :wikitext(args.caption) end return end td:addClass('druid-main-images') local imagesContainer = td:tag('div') :addClass('druid-main-images-files') for i, image in ipairs(images) do local container = imagesContainer:tag('div') :addClass('druid-main-images-file') :addClass('druid-toggleable') :attr('data-druid', h.counter .. '-' .. i) :wikitext(image) :attr('data-druid-tab-key', tabs[i]) local labelText if tabs[i] then labelText = args[tabs[i] .. '_label'] or tabs[i] else labelText = '[[Category:Infoboxes missing image labels]]Image ' .. i end if args[labelText .. '_caption'] then container:tag('div') :addClass('druid-main-images-caption') :wikitext(args[labelText .. '_caption']) end if i == 1 then container:addClass('focused') end end end function h.getImageTabTexts(tabs, images, args) if #tabs == 0 and #images <= 1 then return {} end local texts = {} local i = 1 while images[i] or tabs[i] do if tabs[i] then texts[i] = args[tabs[i] .. '_label'] or tabs[i] else texts[i] = '[[Category:Infoboxes missing image labels]]Image ' .. i end i = i + 1 end return texts end function h.printTabs(td, tabs, texts, isSection, args) if #texts == 0 then return end local container = td:tag('div') :addClass('druid-main-images-labels') :addClass('druid-tabs') if isSection then container:addClass('druid-section-tabs') end for i, item in ipairs(tabs) do local label = container:tag('div') :addClass('druid-main-images-label') :addClass('druid-tab') :addClass('druid-toggleable') :attr('data-druid', h.counter .. '-' .. i) :wikitext(texts[i]) :attr('data-druid-tab-key', item) if isSection then label:addClass('druid-section-tab') else label:addClass('druid-title-tab') end if i == 1 then label:addClass('focused') end -- this can be null, don't concat anything here label:addClass(args[item .. '_class']) end end function h.makeGridSection(section, sectionFields, args, numCols) local numItems = h.countItems(sectionFields, section, args) if numItems == 0 then return end local node = mw.html.create(h.getTag('section')) :addClass('druid-section-container') h.printSectionHeader(node, section, args) h.printSectionTabs(node, section, args) local tr = node:tag(h.getTag('row')) :attr('data-druid-section-row', h.escape(section)) if args[section .. '_collapsed'] then tr:addClass('druid-collapsed') end local grid = tr:tag(h.getTag('cell')) :attr('colspan', 2) :addClass('druid-grid-section') :addClass('druid-grid-section-' .. h.escape(section)) :addClass(args[section .. '_class']) -- warning: class can be nil, don't concat anything :tag('div') :addClass('druid-grid') local row, col, i = 1, 1, 1 local sizeOfLastRow = numItems % numCols local lcm = h.getNumGridCols(numItems, sizeOfLastRow, numCols) grid:css('grid-template-columns', ('repeat(%s, 1fr)'):format(lcm)) local size = lcm / numCols for _, item in ipairs(sectionFields) do local node = mw.html.create('div') local shouldPrint = h.printData(node, item, section, args) if shouldPrint then if i == numItems - sizeOfLastRow + 1 then size = lcm / sizeOfLastRow end i = i + 1 local gStart = (col - 1) * size + 1 local gEnd = (col) * size + 1 local itemContainer = grid:tag('div') :addClass('druid-grid-item') :addClass('druid-grid-item-' .. h.escape(item)) :addClass(args[item .. '_class']) -- warning: class can be nil, don't concat anything :css('grid-column', ('%s / %s'):format(gStart, gEnd)) :css('grid-row', row) if not h.castBool(args[item .. '_nolabel']) then h.printLabel(itemContainer:tag('div'), item, args) end itemContainer:node(node) if col == numCols then row = row + 1 col = 1 else col = col + 1 end end end return node end function h.makeSection(section, sectionFields, args) if section == '' then return end -- bruteforce fix for trailing commas local shouldPrint = false local container = mw.html.create(h.getTag('section')) :addClass('druid-section-container') :addClass(args[section .. '_class']) -- warning: class can be nil, don't concat anything h.printSectionHeader(container, section, args) h.printSectionTabs(container, section, args) for _, item in ipairs(sectionFields) do local node = mw.html.create(h.getTag('cell')) local shouldPrintItem = h.printData(node, item, section, args) if shouldPrintItem then shouldPrint = true local tr = container:tag(h.getTag('row')) :addClass('druid-row') :addClass('druid-row-' .. h.escape(item)) :addClass(args[item .. '_class']) -- warning: class can be nil, don't concat anything :attr('data-druid-section-row', h.escape(section)) if args[section .. '_collapsed'] then tr:addClass('druid-collapsed') end if h.castBool(args[item .. '_wide']) or h.castBool(args[item .. '_nolabel']) then node :attr('colspan', 2) :addClass('druid-data-wide') else h.printLabel(tr:tag(h.getTag('label')), item, args) end tr:node(node) end end if not shouldPrint then return nil end return container end function h.countItems(sectionFields, section, args) local numItems = 0 for _, v in ipairs(sectionFields) do -- we aren't actually printing here, but we're finding out if we should print anything -- because we need the count of columns before we print anything in grid data if h.printData(mw.html.create(), v, section, args) then numItems = numItems + 1 end end return numItems end function h.getNumGridCols(numItems, sizeOfLastRow, numCols) if not numCols then return numItems, 1 end if numItems < numCols then return numItems, 1 end if sizeOfLastRow == 0 then return numCols, 1 end local a, b = sizeOfLastRow, numCols while b ~= 0 do a, b = b, a % b end local lcm = sizeOfLastRow * numCols / a return lcm end function h.printLabel(node, item, args) return node :addClass('druid-label') :addClass('druid-label-' .. h.escape(item)) :wikitext(args[item .. '_display'] or args[item .. '_label'] or item) end function h.printData(node, item, section, args) -- prints data to the node -- and also returns whether the item is nonempty or not local hasData = false local sectionTabs = args[section .. '_tabs'] local tabs = args.tabs if sectionTabs and #sectionTabs > 0 then tabs = sectionTabs end if not tabs or #tabs == 0 then return h.printSimpleData(node, item, args) end if not h.hasComplexData(item, tabs, args) then return h.printSimpleData(node, item, args) end hasData = hasData or h.printTabbedDataItem(node, item, tabs, args) if hasData then node:addClass('druid-data') end return hasData end function h.getTabbedContent(args, label, item) return args[label .. '_' .. item] or args[item] or TABBED_NONEXIST end function h.printSimpleData(node, item, args) if args[item] and type(args[item]) ~= 'string' then error(("Invalid use of field %s as both a section and a data value"):format(item)) end if not args[item] then return false end node:addClass('druid-data') :addClass('druid-data-' .. h.escape(item)) :addClass('druid-data-nonempty') :wikitext('\n\n' .. args[item]) return true end function h.hasComplexData(item, tabs, args) for _, v in ipairs(tabs) do if args[v .. '_' .. item] then return true end end return false end function h.printSectionHeader(node, section, args) if h.castBool(args[section .. '_nolabel']) then return end local tr = node:tag(h.getTag('row')) :attr('data-druid-section', h.escape(section)) local th = tr:tag(h.getTag('sectionTitle')) :attr('colspan', 2) :addClass('druid-section') :addClass('druid-section-' .. h.escape(section)) if args[section .. '_collapsible'] or args[section .. '_collapsed'] then tr:addClass('druid-collapsible') if args[section .. '_collapsed'] then tr:addClass('druid-collapsible-collapsed') end end local emptySections = {} for _, label in ipairs(args.tabs) do local hasLabel = false for _, item in ipairs(args[section] or {}) do if h.getTabbedContent(args, label, item) then hasLabel = true end end if not hasLabel then emptySections[label] = true end end if not next(emptySections) then th:wikitext(args[section .. '_label'] or section) return end for i, label in ipairs(args.tabs) do local div = th:tag('div') :addClass('druid-toggleable-heading') :addClass('druid-toggleable') :attr('data-druid', h.counter .. '-' .. i) :wikitext(args[section .. '_label'] or section) -- we are going to print the section content even in empty nodes -- for compatibility with browsers without :has, where hiding empty rows won't happen if emptySections[label] then div:addClass('druid-toggleable-heading-empty') end if i == 1 then div:addClass('focused') end end end function h.printSectionTabs(node, section, args) local tabs = args[section .. '_tabs'] if not tabs or #tabs == 0 then return end local tr = node:tag(h.getTag('sectionTabsOuter')) :attr('data-druid-section', h.escape(section)) local th = tr:tag(h.getTag('sectionTabs')) :attr('colspan', 2) :addClass('druid-section-tabs') :addClass('druid-section-tabs-' .. h.escape(section)) local texts = {} for i, item in ipairs(tabs) do texts[i] = args[item .. '_label'] or item end h.printTabs(th, tabs, texts, true, args) end ---------------------------- -- general utility functions ---------------------------- function h.overwrite() -- this is a generic utility function that collects args from the invoke call & the parent template. -- normally, you merge args with parent template overwriting the invoke call, but -- since we'll be putting markup/formatting into our invoke call, -- we actually want to overwrite what the user sent. local f = mw.getCurrentFrame() local origArgs = f.args local parentArgs = f:getParent().args local args = {} for k, v in pairs(parentArgs) do v = mw.text.trim(v) if v ~= '' then args[k] = v end end for k, v in pairs(origArgs) do v = mw.text.trim(tostring(v)) if v ~= '' then args[k] = v end end return args end -- generic utility functions -- these would normally be provided by other modules, but to make installation easy -- I'm including everything here function h.split(text, pattern, plain) if not text then return {} end local ret = {} for m in h.gsplit(text, pattern, plain) do ret[#ret+1] = m end return ret end function h.gsplit( text, pattern, plain ) if not pattern then pattern = ',' end if not plain then pattern = '%s*' .. pattern .. '%s*' end local s, l = 1, text:len() return function () if s then local e, n = text:find( pattern, s, plain ) local ret if not e then ret = text:sub( s ) s = nil elseif n < e then -- Empty separator! ret = text:sub( s, e ) if e < l then s = e + 1 else s = nil end else ret = e > s and text:sub( s, e - 1 ) or '' s = n + 1 end return ret end end, nil, nil end function h.escape(s) s = s:gsub(' ', '') :gsub('"', '') :gsub("'", '') :gsub("%?", '') :gsub("%%", '') :gsub("%[", '') :gsub("%]", '') :gsub("{", '') :gsub("}", '') :gsub("!", '') return s end -- normally I would make these constants at the top of the file -- but I don't want to mistake them with user-set constants h.boolFalse = { ['false'] = true, ['no'] = true, [''] = true, ['0'] = true, ['nil'] = true } function h.castBool(x) if not x then return false end return not h.boolFalse[tostring(x):lower()] end h.htmlEntities = { table = { container = 'table', titleOuter = 'tr', titleInner = 'th', section = '', sectionTitle = 'th', sectionTabsOuter = 'tr', sectionTabs = 'td', row = 'tr', label = 'th', cell = 'td', }, div = { container = 'div', titleOuter = 'div', titleInner = 'div', section = 'div', sectionTitle = 'div', sectionTabsOuter = 'div', sectionTabs = 'div', row = 'div', label = 'div', cell = 'div', } } function h.getTag(key) -- try not to totally fail here return h.htmlEntities[h.entityType or 'div'][key] end return p 0b872baa88950499ed588906ea3b07f363640076 Module:Infobox/doc 828 11 19 2025-08-20T01:22:27Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{luadoc}} This module enables the creation of [[support:DRUID infoboxes|DRUID infoboxes]]. 0ce687b29fc5e2d6cad14853a8412fa91910000f Module:Navbox 828 12 20 2025-08-20T01:22:27Z ARTIFICER 564804 Importing default loadout Scribunto text/plain -- version 1.2.5 -- config table for RANGER. -- If you want to change the default config, DO NOT change it here, -- please do it via the `onLoadConfig` hook in [[Module:Navbox/Hooks]]. local config = { default_navbox_class = "navigation-not-searchable", -- Base value of the `class` parameter. default_title_class = nil, -- Base value of the `title_class` parameter. default_above_class = nil, -- Base value of the `above_class` parameter. default_below_class = nil, -- Base value of the `below_class` parameter. default_section_class =nil, -- Base value of the `section_class` parameter. default_header_class = nil, -- Base value of the `header_class` parameter. default_group_class = nil, -- Base value of the `group_class` parameter. default_list_class = 'hlist', -- Base value of the `list_class` parameter. default_header_state = nil, -- Base value of the `state` parameter. editlink_hover_message_key = 'Navbox-edit-hover', -- The system message name for hover text of the edit icon. auto_flatten_top_level = true, -- If true, when a section has only one list with no content and no corresponding group but has sublists, these sublists will be moved to top level. -- This helps make the hierarchy of sections and content clearer. -- An example: -- {{navbox -- ... -- |header1 = Items -- | group1.1 = Weapons -- | list1.1 = Swords · Guns · Wands -- | group1.2 = Armors -- | list1.2 = Head pieces · Capes -- |header2 = NPCs -- | group2.1 = Town NPCs -- | list2.1 = Guide · Witch -- ... -- }} -- will be equal to: -- {{navbox -- ... -- |header1 = Items -- | group2 = Weapons -- | list2 = Swords · Guns · Wands -- | group3 = Armors -- | list3 = Head pieces · Capes -- |header5 = NPCs -- | group6 = Town NPCs -- | list6 = Guide · Witch -- ... -- }} custom_render_handle = nil, -- usually for debugging purposes only. if set, it should be a function accept 2 parameters: `dataTree` and `args`, and return a string as module output. } --------------------------------------------------------------------- -- Argument alias. local CANONICAL_NAMES = { ['titlestyle'] = 'title_style', ['listclass'] = 'list_class', ['groupstyle'] = 'group_style', ['collapsible'] = 'state', ['editlink'] = 'meta', ['editlinks'] = 'meta', ['editicon'] = 'meta', ['edit_link'] = 'meta', ['edit_links'] = 'meta', ['edit_icon'] = 'meta', ['navbar'] = 'meta', ['name'] = 'template', ['evenodd'] = 'striped', ['class'] = 'navbox_class', ['css'] = 'navbox_style', ['style'] = 'navbox_style', ['group'] = '1:group', ['list'] = '1:list', } local DEFAULT_ARGS = { ['meta'] = true, } local STATES = { ['no'] = '', ['off'] = '', ['plain'] = '', ['collapsed'] = 'mw-collapsible mw-collapsed', ['expanded'] = 'mw-collapsible', } local BOOL_FALSE = { ['no'] = true, ['off'] = true, ['false'] = true, } local STRIPED = { ['odd'] = 'striped-odd', ['swap'] = 'striped-odd', ['y'] = 'striped-even', ['yes'] = 'striped-even', ['on'] = 'striped-even', ['even'] = 'striped-even', ['striped'] = 'striped-even', } local NAVBOX_CHILD_INDICATOR = '!!C$H$I$L$D!!' local NAVBOX_CHILD_INDICATOR_LENGTH = string.len( NAVBOX_CHILD_INDICATOR ) local CLASS_PREFIX = 'ranger-' --------------------------------------------------------------------- local p = {} local h = {} -- non-public local hooks = mw.title.new('Module:Navbox/Hooks').exists and require('Module:Navbox/Hooks') or {} --------------------------------------------------------------------- -- For templates: {{#invoke:navbox|main|...}} function p.main(frame) local args = p.mergeArgs(frame) return p.build(args, true) end -- For modules: return require('module:navbox').build(args) -- By default this method will skip the arguments sanitizing phase -- (and onSanitizeArgsStart/onSanitizeArgsEnd hooks). -- Set `doParseArgs` to true to do arguments sanitizing. -- If `customConfig` table is provided, it will be merged into default config table (after onLoadConfig()). -- If `customHooks` table is provided, all default hook handles will be overrided, unprovided hooks will be empty. function p.build(args, doParseArgs, customConfig, customHooks) if customHooks then hooks = customHooks end if doParseArgs then args = h.parseArgs(args) end h.runHook('onLoadConfig', config, args) if customConfig then for k,v in pairs(customConfig) do config[k] = v end end --merge default args for k,v in pairs(DEFAULT_ARGS) do if args[k] == nil then args[k] = DEFAULT_ARGS[k] end end h.runHook('onBuildTreeStart', args) local dataTree = h.buildDataTree(args) h.runHook('onBuildTreeEnd', dataTree, args) if type(config.custom_render_handle) == 'function' then return config.custom_render_handle(dataTree, args) else return h.render(dataTree) end end -- merge args from frame and frame:getParent() -- It may be used when creating custom wrapping navbox module. -- -- For example, Module:PillNavbox -- -- local RANGER = require('Module:Navbox') -- local p = {} -- function p.main(frame) -- return RANGER.build(RANGER.mergeArgs(frame), true, { -- default_navbox_class = 'pill', -- use "pill" style by default. -- }) -- end -- return p -- function p.mergeArgs(frame) local inputArgs = {} for k, v in pairs(frame.args) do v = mw.text.trim(tostring(v)) if v ~= '' then inputArgs[k] = v end end for k, v in pairs(frame:getParent().args) do v = mw.text.trim(v) if v ~= '' then inputArgs[k] = v end end return inputArgs end ------------------------------------------------------------------------ -- equivalent to mw.text.split(str, div, true) for non-empty separator, but can be over 60x faster, since the latter is Unicode-aware. -- Original version credit: http://richard.warburton.it. function h.explode(div, str) if (div=='') then return nil end local pos,arr = 0,{} -- for each divider found for st,sp in function() return string.find(str,div,pos,true) end do arr[#arr+1] = string.sub(str,pos,st-1) -- Attach chars left of current divider pos = sp+1 -- Jump past current divider end arr[#arr+1] = string.sub(str,pos) -- Attach chars right of last divider return arr end function h.parseArgs(inputArgs) h.runHook('onSanitizeArgsStart', inputArgs) local args = {} for k, v in pairs(inputArgs) do if type(k) == 'string' then -- all named args have already been trimmed local key = h.normalizeKey(k) args[key] = h.normalizeValue(key, v) else args[k] = mw.text.trim(v) -- keep number-index arguments (for {{navbox|child|...}}) end end h.runHook('onSanitizeArgsEnd', args, inputArgs) return args end -- Normalize the name string of arguments. -- the normalized form is (index:)?name, in which: -- index is number index such as 1, 1.3, 1.2.45, -- name is in lowercase underscore-case, such as group, group_style -- e.g: header_state, 1.3:list_style -- the input argument name can be: -- * camel-case: listStyle, ListStyle -- * space separated: list style -- * prefix+index+postfix?, and can be in camel-case or space/hyphen separated or mixed: list 1 style, list1, list1Style, list1_style -- * index.name: 1.3.list -- * index_name: 1.3_list (Space separated are treated as underscore separated, therefore 1.3 list are vaild too) function h.normalizeKey(s) -- camel-case to lowercase underscore-case s = s:gsub('%l%f[%u]', '%0_') -- listStyle to list_style s = (s:gsub(' ', '_')):lower() -- space to underscore s = s:gsub('%l%f[%d]', '%0_') -- group1* to group_1* s = s:gsub('%d%f[%l]', '%0_') -- *1style to *1_style -- number format x_y_z to x.y.z s = s:gsub('(%d)_%f[%d]', '%1%.') -- move index to the beginning: -- group_1.2_style to 1.2:group_style -- group_1 to 1:group s = s:gsub('^([%l_]+)_([%d%.]+)', '%2:%1') -- support index.name and index_name: -- 1.2.group / 1.2_group to 1.2:group s = s:gsub('^([%d%.]+)[%._]%f[%l]', '%1:') -- now the key should be in normalized form, if the origin key is vaild -- standardize *_css to *_style s = s:gsub('_css$', '_style') -- standardize *collapsible to *state s = s:gsub('collapsible$', 'state') -- standardize all aliases to the canonical name return CANONICAL_NAMES[s] or s end function h.normalizeValue(k, v) k = tostring(k) if k:find('_style$') then v = (v .. ';'):gsub(';;', ';') return v elseif k:find('state$') then return STATES[v] elseif k == 'striped' then return STRIPED[v] elseif k == 'meta' then return not BOOL_FALSE[v] elseif v:sub(1, 2) == '{|' or v:match('^[*:;#]') then -- Applying nowrap to lines in a table does not make sense. -- Add newlines to compensate for trim of x in |parm=x in a template. return '\n' .. v ..'\n' end return v end -- parse arguments, convert them to structured data tree function h.buildDataTree(args) -- parse args to a tree local tree = h.buildTree(args) -- build root navbox data local data = h.buildNavboxData(tree.info) -- Recursively build section tree if tree.children then data.sections = h.buildSections(tree.children, { listClass = h.mergeAttrs(args.list_class, config.default_list_class), listStyle = args.list_style, groupClass = h.mergeAttrs(args.group_class, config.default_group_class), groupStyle = args.group_style, sectionClass = h.mergeAttrs(args.section_class, config.default_section_class), sectionStyle = args.section_style, headerClass = h.mergeAttrs(args.header_class, config.default_header_class), headerStyle = args.header_style, headerState = args.header_state or config.default_header_state, }) end if args[1] == 'child' then data.CHILD_MODE = true end return data end function h.buildSections(list, defaults) local sections = {} local section = nil for k, node in h.orderedPairs(list) do local info = node.info or {} --start a new section if needed if info.header or not section then section = { class = h.mergeAttrs(info.section_class, defaults.sectionClass), style = h.mergeAttrs(info.section_style, defaults.sectionStyle), body = {} } -- Section header if needed. -- If the value of a `|header_n=` is two or more consecutive "-" characters (e.g. --, -----), -- it means start a new section without header, and the new section will be not collapsable. if info.header and not string.match(info.header, '^%-%-+$') then section.header = { content = info.header, class = h.mergeAttrs(info.header_class, defaults.headerClass), style = h.mergeAttrs(info.header_style, defaults.headerStyle), } section.state = info.state or defaults.headerState or 'mw-collapsible' end sections[#sections+1] = section end -- above/below for this section if info.above then section.above = { content = info.above, class= h.mergeAttrs(info.above_class, config.default_above_class), style = info.above_style, } end if info.below then section.below = { content = info.below, class= h.mergeAttrs(info.below_class, config.default_below_class), style = info.below_style, } end -- this group+list row if info.group or info.list or node.children then local row = {} section.body[#section.body+1] = row if info.group then row.group = { content = info.group, class = h.mergeAttrs(info.group_class, defaults.groupClass), style = h.mergeAttrs(info.group_style, defaults.groupStyle), } end if info.list then if string.sub(info.list, 1, NAVBOX_CHILD_INDICATOR_LENGTH) == NAVBOX_CHILD_INDICATOR then -- it is from {{navbox|child| ... }} row.sections = mw.text.jsonDecode(string.sub(info.list, NAVBOX_CHILD_INDICATOR_LENGTH+1)) else row.list = { content = info.list, class = h.mergeAttrs(info.list_class, defaults.listClass), style = h.mergeAttrs(info.list_style, defaults.listStyle), } end end -- sub-nodes, will override {{navbox|child| ... }} if node.children then row.sections = h.buildSections(node.children, defaults) end end end -- flatten if needed: -- If a section has only one list with no content and no corresponding group but has sublists, these sublists will be moved to upper level. if config.auto_flatten_top_level then for _, sect in ipairs(sections) do if #sect.body == 1 then local node = sect.body[1] if not node.group and not node.list and node.sections and #node.sections == 1 and not node.sections[1].header then sect.body = node.sections[1].body end end end end return sections end function h.buildNavboxData(info) local data = { state = info.state or 'mw-collapsible', -- here we need a default value for empty input striped = info.striped, class = h.mergeAttrs(info.navbox_class, config.default_navbox_class), style = info.navbox_style, } -- data for titlebar if info.title or info.meta or data.state ~= '' then data.title = { content = info.title, class = h.mergeAttrs(info.title_class, config.default_title_class), style = info.title_style, } if info.meta then data.metaLinks = { link = info.meta_link, -- will be used as [[$link|$text]] url = info.meta_url, -- will be used as [$url $text], only if there is no data.metaLinks.link text = info.meta_text, --hovertext } if not info.meta_link and not info.meta_url then -- default link target local title = mw.title.new(info.template or mw.getCurrentFrame():getParent():getTitle(), 'Template') if not title then error('Invalid title ' .. info.template) end data.metaLinks.link = title.fullText end if not info.meta_text then local msg = mw.message.new(config.editlink_hover_message_key) data.metaLinks.text = msg:exists() and msg:plain() or 'View or edit this template' end end end -- above/below if info.above then data.above = { content = info.above, class= h.mergeAttrs(info.above_class, config.default_above_class), style = info.above_style, } end if info.below then data.below = { content = info.below, class= h.mergeAttrs(info.below_class, config.default_below_class), style = info.below_style, } end return data end -- parse arguments, convert them into a tree based on their index -- each node on tree is { info = { #data for this node# }, children = {#children nodes#} } function h.buildTree(args, defaults) local tree = { info = {} } local check = function(key, value) local index, name = string.match(key, '^([%d%.]+):(.+)$') -- no number index found, for root node if not index then tree.info[key] = value return end -- filter invalid number index if string.match(index, '^%.') or string.match(index, '%.$') or string.match(index, '%.%.') then return end -- find the node that matches the index in the tree local arr = h.explode('.', index) local node = tree for _, v in ipairs(arr) do v = tonumber(v) if not node.children then node.children = {} end if not node.children[v] then node.children[v] = { info = {} } end node = node.children[v] end node.info[name] = value end for k,v in pairs(args) do check(k, v) end return tree end function h.render(data) -- handle {{navbox|child|...}} syntax if data.CHILD_MODE then return NAVBOX_CHILD_INDICATOR..mw.text.jsonEncode(data.sections) end ----- normal case ----- local out = mw.html.create() -- build navbox container local navbox = out:tag('div') :attr('role', 'navigation'):attr('aria-label', 'Navbox') :addClass(CLASS_PREFIX..'navbox') :addClass(data.class) :addClass(data.striped) :addClass(data.state) :cssText(data.style) --title bar if data.title then local titlebar = navbox:tag('div'):addClass(CLASS_PREFIX..'title') titlebar:tag('div'):addClass('mw-collapsible-toggle-placeholder') if data.metaLinks then titlebar:node(h.renderMetaLinks(data.metaLinks)) end if data.title then titlebar:addClass(data.title.class):tag('div') :addClass(CLASS_PREFIX..'title-text') :addClass(data.title.class) :cssText(data.title.style) :wikitext(data.title.content) end end --above if data.above then navbox:tag('div') :addClass(CLASS_PREFIX..'above mw-collapsible-content') :addClass(data.above.class) :cssText(data.above.style) :wikitext(data.above.content) :attr('id', (not data.title) and mw.uri.anchorEncode(data.above.content) or nil) -- id for aria-labelledby attribute, if no title end -- sections if data.sections then h.renderSections(data.sections, navbox, 0, true) else -- Insert a blank section for completely empty navbox to ensure it behaves correctly when collapsed. if not data.above and not data.below then navbox:tag('div'):addClass(CLASS_PREFIX..'section mw-collapsible-content') end end --below if data.below then navbox:tag('div') :addClass(CLASS_PREFIX..'below mw-collapsible-content') :addClass(data.below.class) :cssText(data.below.style) :wikitext(data.below.content) end return tostring(out)..'[[Category:Pages with navboxes]]' -- suggest to use HIDDENCAT here; will be used for maintenance & gadget imports end function h.renderSections(data, container, level, even) for i,sect in ipairs(data) do --section box local section = container:tag('div') :addClass(CLASS_PREFIX..'section mw-collapsible-content') :addClass(sect.class) :addClass(sect.state) :cssText(sect.style) -- section header if sect.header then section:tag('div') :addClass(CLASS_PREFIX..'header') :addClass(sect.header.class) :cssText(sect.header.style) :tag('div'):addClass('mw-collapsible-toggle-placeholder'):done() :tag('div'):addClass(CLASS_PREFIX..'header-text'):wikitext(sect.header.content) end -- above: if sect.above then section:tag('div') :addClass(CLASS_PREFIX..'above mw-collapsible-content') :addClass(sect.above.class) :cssText(sect.above.style) :wikitext(sect.above.content) end -- body: groups&lists local box = section:tag('div'):addClass(CLASS_PREFIX..'section-body mw-collapsible-content') even = h.renderBody(sect.body, box, level, (level==0) and true or even) -- reset even status each section -- below: if sect.below then section:tag('div') :addClass(CLASS_PREFIX..'below mw-collapsible-content') :addClass(sect.below.class) :cssText(sect.below.style) :wikitext(sect.below.content) end end return even end function h.renderMetaLinks(info) local box = mw.html.create('span'):addClass(CLASS_PREFIX..'meta') local meta = box:tag('span'):addClass('nv nv-view') if info.link then meta:wikitext('[['..info.link..'|') :tag('span'):wikitext(info.text):attr('title', info.text):done() :wikitext(']]') elseif info.url then meta:wikitext('['..info.url..' ') :tag('span'):wikitext(info.text):attr('title', info.text):done() :wikitext(']') end return box end function h.renderBody(info, box, level, even) local count = 0 for _,v in h.orderedPairs(info) do if v.group or v.list or v.sections then count = count + 1 -- row container local row = box:tag('div'):addClass(CLASS_PREFIX..'row') -- group cell if v.group or (v.sections and level > 0 and not v.list) then local groupCell = row:tag('div') :addClass(CLASS_PREFIX..'group level-'..level) :addClass((level > 0) and CLASS_PREFIX..'subgroup' or nil) local groupContentWrap = groupCell:tag('div'):addClass(CLASS_PREFIX..'wrap') if v.group then groupCell:addClass(v.group.class):cssText(v.group.style) groupContentWrap:wikitext(v.group.content) else groupCell:addClass('empty') row:addClass('empty-group-list') end else row:addClass('empty-group') end -- list cell local listCell = row:tag('div'):addClass(CLASS_PREFIX..'listbox') if not v.list and not v.sections then listCell:addClass('empty') row:addClass('empty-list') end if v.list or (v.group and not v.sections) then --listCell:node(h.renderList(v['list'] or '', k, level, args)) even = not even -- flip even/odd status local cell = listCell:tag('div') :addClass(CLASS_PREFIX..'wrap') :addClass(even and CLASS_PREFIX..'even' or CLASS_PREFIX..'odd') if v.list then cell:addClass(v.list.class):cssText(v.list.style) :tag('div'):addClass(CLASS_PREFIX..'list'):wikitext(v.list.content) end end if v.sections then local sublistBox = listCell:tag('div'):addClass(CLASS_PREFIX..'sublist level-'..level) even = h.renderSections(v.sections, sublistBox, level+1, even) end end end if count > 0 then box:css('--count', count) -- for flex-grow end return even end -- pairs, but sort the keys alphabetically function h.orderedPairs(t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end -- For cascading parameters, such as style or class, they are merged in exact order (from general to specific). -- Any parameter starting with multiple hyphens(minus signs) will terminate the cascade. -- An example: -- For group_1.1, its style is affected by parameters |group_1.1_style=... , |subgroup_level_1_style=... , and |subgroup_style=... . -- If we have |group_1.1_style= color:red; |subgroup_level_1_style= font-weight: bold; and |subgroup_style= color: green; , -- the style of group_1.1 will be style="color:green; font-weight: bold; color: red;" ; -- if we have |group_1.1_style= -- color:red; |subgroup_level_1_style= font-weight: bold; and |subgroup_style= color: green; , -- the style of group_1.1 will be style="color: red;" only, and the cascade is no longer performed for |subgroup_level_1_style and |subgroup_style. function h.mergeAttrs(...) local trim = mw.text.trim local s = '' for i=1, select('#', ...) do local v = trim(select(i, ...) or '') local str = string.match(v, '^%-%-+(.*)$') if str then s = trim(str..' '..s) break else s = trim(v..' '..s) end end if s == '' then s = nil end return s end function h.runHook(key, ...) if hooks[key] then hooks[key](...) end end ----------------------------------------------- return p 9dddb0f4a65fa1907b3503052e13630ad4bc8bb2 Module:ArgsUtil 828 13 21 2025-08-20T01:22:28Z ARTIFICER 564804 Importing default loadout Scribunto text/plain local p = {} function p.merge() local f = mw.getCurrentFrame() local origArgs = f.args local parentArgs = f:getParent().args local args = {} for k, v in pairs(origArgs) do v = mw.text.trim(tostring(v)) if v ~= '' then args[k] = v end end for k, v in pairs(parentArgs) do v = mw.text.trim(v) if v ~= '' then args[k] = v end end return args end return p 1d1b2105bd857dcc5e33c8c0a8a780f67cbae72e Module:ArgsUtil/doc 828 14 22 2025-08-20T01:22:28Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This is a basic module for processing args. Usage: <syntaxhighlight lang="lua"> local util_args = require('Module:ArgsUtil') local p = {} function p.main(frame) local args = util_args.merge() -- it is not necessary to pass a `frame` object; `merge` will generate its own mw.logObject(args) -- `args` now contains args passed via the template merged with defaults provided directly via the invoke. -- anything the user sent via the template will be given priority. end return p </syntaxhighlight> == Extending this module == By design, {{ml|ArgsUtil}} is shipped with only a single function and no customization available; this simplifies documentation and covers nearly all use cases. An extended version of this module is available at [[support:Module:ArgsUtil|Module:ArgsUtil on the support wiki]] if you want additional functionality; and you can of course feel free to modify this module on your own wiki as needed. 6fc2a23dcff62ac5a222903e46bc56c07b0a2b1f Module:Template link 828 15 23 2025-08-20T01:22:29Z ARTIFICER 564804 Importing default loadout Scribunto text/plain -- This code is adapted from Wikipedia -- For the original, please see: https://en.wikipedia.org/wiki/Module:Template_link_general -- This implements Template:Tlg local getArgs = require('Module:ArgsUtil').merge local p = {} -- Is a string non-empty? local function _ne(s) return s ~= nil and s ~= "" end local nw = mw.text.nowiki local function addTemplate(s) local i, _ = s:find(':', 1, true) if i == nil then return 'Template:' .. s end local ns = s:sub(1, i - 1) if ns == '' or mw.site.namespaces[ns] then return s else return 'Template:' .. s end end local function trimTemplate(s) local needle = 'template:' if s:sub(1, needle:len()):lower() == needle then return s:sub(needle:len() + 1) else return s end end local function linkTitle(args) if _ne(args.nolink) then return args[1] end local titleObj local titlePart = '[[' if args[1] then -- This handles :Page and other NS titleObj = mw.title.new(args[1], 'Template') else titleObj = mw.title.getCurrentTitle() end titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or addTemplate(args[1])) local textPart = args.alttext if not _ne(textPart) then if titleObj ~= nil then textPart = titleObj:inNamespace("Template") and args[1] or titleObj.fullText else -- redlink textPart = args[1] end end if _ne(args.subst) then -- HACK: the ns thing above is probably broken textPart = 'subst:' .. textPart end if _ne(args.brace) then textPart = nw('{{') .. textPart .. nw('}}') elseif _ne(args.braceinside) then textPart = nw('{') .. textPart .. nw('}') end titlePart = titlePart .. '|' .. textPart .. ']]' if _ne(args.braceinside) then titlePart = nw('{') .. titlePart .. nw('}') end return titlePart end function p.main(frame) local args = getArgs() return p._main(args) end function p._main(args) local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname) local italic = _ne(args.italic) or _ne(args.italics) local dontBrace = _ne(args.brace) or _ne(args.braceinside) local code = _ne(args.code) or _ne(args.tt) local show_result = _ne(args._show_result) local expand = _ne(args._expand) -- Build the link part local titlePart = linkTitle(args) if bold then titlePart = "'''" .. titlePart .. "'''" end if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end -- Build the arguments local textPart = "" local textPartBuffer = "&#124;" local codeArguments = {} local codeArgumentsString = "" local i = 2 local j = 1 while args[i] do local val = args[i] if val ~= "" then if _ne(args.nowiki) then -- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will -- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up val = nw(mw.text.unstripNoWiki(val)) end local k, v = string.match(val, "(.*)=(.*)") if not k then codeArguments[j] = val j = j + 1 else codeArguments[k] = v end codeArgumentsString = codeArgumentsString .. textPartBuffer .. val if italic then val = '<span style="font-style:italic;">' .. val .. '</span>' end textPart = textPart .. textPartBuffer .. val end i = i + 1 end -- final wrap local ret = titlePart .. textPart if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end if _ne(args.a) then ret = nw('*') .. '&nbsp;' .. ret end if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end if code then ret = '<code>' .. ret .. '</code>' elseif _ne(args.plaincode) then ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>' end if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end --[[ Wrap as html?? local span = mw.html.create('span') span:wikitext(ret) --]] if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end if show_result then local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments} ret = ret .. " → " .. result end if expand then local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}') local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query) mw.log() ret = ret .. " [" .. tostring(url) .. "]" end return ret end return p 45d40a4bff9a1d0eb4274f56fb2f17849aa68728 Module:Template link/doc 828 16 24 2025-08-20T01:22:30Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{From Wikipedia|Module:Template link general}} 1a395265ccbd055518c1d14b52362cc148b89c81 Module:Main page 828 17 25 2025-08-20T01:22:31Z ARTIFICER 564804 Importing default loadout Scribunto text/plain local p = {} local h = {} -- merge args from frame and frame:getParent() function h.mergeArgs(frame) local inputArgs = {} for k, v in pairs(frame.args) do v = mw.text.trim(tostring(v)) if v ~= '' then inputArgs[k] = v end end for k, v in pairs(frame:getParent().args) do v = mw.text.trim(v) if v ~= '' then inputArgs[k] = v end end return inputArgs end -------------------------------------------------------------------- function p.main(frame) local args = h.mergeArgs(frame) -- use the rootpage parameter if given, otherwise use the current page name local rootpage = args['rootpage'] or mw.title.getCurrentTitle().fullText local layouts = {'desktop', 'tablet', 'mobile'} for _,layout in pairs(layouts) do -- collapse consecutive line breaks and spaces, then trim -- we need to check for permutations of " \n" because trim can't clean that up if it's in the middle of the string args[layout] = mw.text.trim(args[layout]):gsub("\n\n+", "\n"):gsub(" +", " "):gsub(" \n", "\n"):gsub("\n ", "\n") end -- parse the arguments into CSS variables that contain legal syntax for grid-template-areas local desktop = "--main-page-layout--desktop: '" .. string.gsub(args['desktop'], '\n', "' '") .. "';" local tablet = "--main-page-layout--tablet: '" .. string.gsub(args['tablet' ], '\n', "' '") .. "';" local mobile = "--main-page-layout--mobile: '" .. string.gsub(args['mobile' ], '\n', "' '") .. "';" -- grid-template-columns overrides local desktop_cols = mw.text.trim(string.gsub(args['desktop-columns'] or '', ';', '')) local tablet_cols = mw.text.trim(string.gsub(args[ 'tablet-columns'] or '', ';', '')) local mobile_cols = mw.text.trim(string.gsub(args[ 'mobile-columns'] or '', ';', '')) -- set the variables used by grid-template-columns if desktop_cols ~= '' then desktop = desktop .. '--main-page-layout-columns--desktop: '.. desktop_cols ..';' end if tablet_cols ~= '' then tablet = tablet .. '--main-page-layout-columns--tablet: '.. tablet_cols ..';' end if mobile_cols ~= '' then mobile = mobile .. '--main-page-layout-columns--mobile: '.. mobile_cols ..';' end local boxes = {} -- list of all boxes as a simple list, used to set the order of appearance local seen_boxes = {} -- list of all boxes as a k:v pair, used to filter out duplicates local boxes_in_layout = {} -- list of layouts, then list of all boxes in that layout local missing_boxes = {} -- list of layouts, then list of boxes that are *not* included in that layout -- add every box referenced in the layout rules once function parse_layout(layout) for _,name in pairs(mw.text.split(mw.text.trim(args[layout]), '%s')) do if not seen_boxes[name] then boxes[#boxes+1] = name -- table with numerical keys for set html order seen_boxes[name] = true end boxes_in_layout[layout][name] = true end end -- loop through the layouts the first time to set up the box lists for _,layout in pairs(layouts) do boxes_in_layout[layout] = {} missing_boxes[layout] = {} parse_layout(layout) end -- then loop through the layouts a second time because we need to compare those completed lists to check for missing boxes for _,layout in pairs(layouts) do for _,name in pairs(boxes) do if boxes_in_layout[layout][name] ~= true then mw.addWarning( 'WARNING: the \"' .. name .. '\" box is missing in the ' .. layout .. ' layout. If this is intentional, you can ignore this warning.') missing_boxes[layout][name] = true end end end -- start our mp-container wrapper, and add our variables from earlier as inline styles to declare them -- the rootpage is added to the dataset so it's easily accessible by mp-edit-links.js and it doesn't need to make its own API call local output = mw.html.create() local container = output:tag('div'):attr('id', 'mp-container'):cssText(desktop .. tablet .. mobile):attr('data-rootpage', rootpage) -- loop through boxes and add the relevant main page subpages into the output for _,box in pairs(boxes) do mw.ext.VariablesLua.vardefine('imp-variable-id', box) -- using a vardefine lets us pass this directly to the template without going through the user-facing box local pre_vardefine = '' for _,layout in pairs(layouts) do pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and '0' or '1') .. ',' end -- formatted as a psuedo-bitmask to reduce variable usage, "<display-on-destop>, <display-on-tablet>, <display-on-mobile>," each value is 0 or 1 (trailing comma is insignificant) -- expected to be used with #explode in the template receiving the variable mw.ext.VariablesLua.vardefine('imp-variable-display-box', pre_vardefine) if mw.title.new(rootpage .. '/' .. box).exists then container:wikitext(frame:expandTemplate{ title = ':' .. rootpage .. '/' .. box}) else container:wikitext(frame:expandTemplate{ title = 'Main page box/missing', args = { box, rootpage = rootpage}}) -- See [[Template:Main page box/missing]] end end return output end return p c6237f93b472a243ae7393913c285b3ae62c08f5 Module:Navbox/Hooks 828 18 26 2025-08-20T01:22:32Z ARTIFICER 564804 Importing default loadout Scribunto text/plain -- as of Module:Navbox version 1.2.5 local p = {} --------------------------------------------------- -- Runs before RANGER does args sanitizing -- `inputArgs` is the merged input arguments from the template (frame.args + frame:getParent().args) function p.onSanitizeArgsStart(inputArgs) end -- Runs after RANGER does args sanitizing -- `args` parameter is the sanitized arguments table with normalized keys (in lowercase underscore-case with canonical names) and normalized values. function p.onSanitizeArgsEnd(args, inputArgs) end -- Runs when RANGER loads config table (after onSanitizeArgsEnd and before onBuildTreeStart) -- `config` parameter is the default config table. -- `args` parameter is the sanitized arguments table (has not yet merged the DEFAUT_ARGS table). function p.onLoadConfig(config, args) end -- Runs before RANGER converts sanitized arguments table to structured data tree -- `args` parameter is the sanitized arguments table that has the DEFAUT_ARGS merged. function p.onBuildTreeStart(args) end -- Runs after RANGER converts sanitized arguments table to structured data tree -- `tree` parameter is the structured data. -- `args` parameter is the sanitized arguments table. function p.onBuildTreeEnd(tree, args) end --------------------------------------------------- return p a124a9f396b4a5a6c91de416c6cb8af5342f41fb Module:Navbox/doc 828 19 27 2025-08-20T01:22:32Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This module is used by [[Template:Navbox]]. 87d5c562165cd75b963e03aa428c80413bacff30 Template:Documentation 10 20 28 2025-08-20T01:22:33Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><div class="documentation"><!-- --><div class="documentation-header"><!-- -->[[File:Template-{{#ifexist:{{#vardefineecho:docpage|{{{1|Template:{{#replace:{{{1|{{PAGENAME}}/doc}}}|Template:|}}}}}<!-- end vde -->}}|{{#if:{{{baddoc|}}}|bad}}|no}}info.svg|50px|link=]] <!-- --><span style="font-weight: bold; font-size: 125%; margin-right: 10px;">Documentation</span> <!-- -->{{#ifeq:{{SUBPAGENAME}}|doc|<!--nothing-->|<!-- -->{{#ifexist:{{#var:docpage}}|<!-- --><span style="font-size: 90%; font-style: italic;"><!-- -->[{{fullurl:{{#var:docpage}}|action=edit}} Edit] this documentation at [{{fullurl:{{#var:docpage}}|redirect=no}} {{FULLPAGENAMEE:{{#var:docpage}}}}].<!-- --></span><!-- -->}}<!-- -->}}<!-- --><div style="text-align: right; margin-left: 5px;"><!-- -->([{{fullurl:{{FULLPAGENAMEE}}/doc|action=edit}} edit] • [{{fullurl:{{FULLPAGENAMEE}}/doc|action=history}} history] • [{{fullurl:{{FULLPAGENAMEE}}|action=purge}} purge])<!-- --></div><!-- --></div><!-- <!-- leave line break here --> {{#if:{{{lua|}}}|{{UsesLua|{{{lua}}} }} }} <!-- documentation text/error box begins here --> <div style="border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: 0.5em auto 1em; padding: 0.8em 1.2em; background: var(--wiki-content-background-color--secondary);"> <!-- -->{{#ifexist:{{#var:docpage}}|<!-- If there is documentation --> {{ {{#var:docpage}} }} <!-- Else -->|<!-- -->No documentation subpage exists yet for this template. [{{fullurl:{{FULLPAGENAMEE:Template:{{{1|{{PAGENAME}}}}}}}/doc|action=edit&preload=Template:Documentation/preload}} Create one now].<!-- -->[[Category:Templates with no documentation]]<!-- -->}}<!-- leave line break here --> <!-- documentation text/error box ends here --> </div> <!-- -->{{#ifeq:{{SUBPAGENAME}}|doc|<!-- -->{{#ifeq:{{BASEPAGENAME}}|Doc|<!--nothing-->|<!-- only if page is not Template:Documentation -->This is the documentation page, it should be transcluded into the main template page. See {{tlx|doc}} for more information. <!-- -->[[Category:Template documentation]]<!-- -->}}<!-- -->}}<!-- --></div><!-- --></includeonly><!-- --><noinclude>{{Documentation}} [[Category:Documentation templates| ]] </noinclude> c4c3117e700d89854599fb352f60792ed2165be0 Template:Luadoc 10 21 29 2025-08-20T01:22:33Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <noinclude>[[Category:Documentation templates]]</noinclude>{{#ifeq:{{int:scribunto-doc-page-name|{{ROOTPAGENAME}}}}|{{FULLPAGENAME}}||<div class="luadoc">Edit the [[{{int:scribunto-doc-page-name|{{ROOTPAGENAME}}}}|documentation or categories]] for this module. {{#ifexist:{{FULLPAGENAME}}/i18n|This module has an [[/i18n|i18n file]].}}</div>}} 37de49949dfa0f16975ff4e9850b4573ec388cb6 Template:MP link 10 22 30 2025-08-20T01:22:34Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- Variables -->{{#vardefine:link|{{{link|{{{1|}}}}}}}}<!-- Image-->{{#if:{{{image|}}}|[[File:{{#replace:{{{image|}}}|File:}}|{{{size|42px}}}|link={{#var:link}}{{#if:{{{altText|}}}|{{!}}alt={{{altText|}}}}}|class={{{imageClass|}}}]]}}<!-- Link below the image -->{{#if:{{{1|}}}|<!-- If it's an external link, use external link syntax -->{{#if:{{#pos:{{{link|}}}|http}}|[{{{link|}}} {{{1|}}}]|<!-- Otherwise use normal syntax the ifeq, pos, sub combo is filtering out a leading :, so that we can add our own without doubling up, allowing easy category linking -->[[:{{#ifeq:{{#pos:{{#var:link}}|:}}|0|{{#sub:{{#var:link}}|1}}|{{#var:link}}}}|{{{1|}}}]]}} }}</includeonly><noinclude> {{doc}} [[Category:Main page templates]] </noinclude> be5325327a3e6c626069e9f98a5dd2b9f283042c Template:MP link/doc 10 23 31 2025-08-20T01:22:35Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This creates one of the stylized and formatted links on the [[{{MediaWiki:Mainpage}}|main page]]. == Usage == Groups of this template should be wrapped inside of <code><nowiki><div class="mp-links"></div></nowiki></code> and each entry should be a separate line in an [[wikipedia:Help:Lists#Basically|unordered list]]. This div can be given one of the classes <code>columns-x</code> where x is a number from 1 to 8, and the links will line up in that many columns if space permits (default is 3). The div can also optionally be given the class <code>stretch</code> and it will stretch the list vertically to fill empty space. See [[Mediawiki:Common.css]] for the full definitions of these classes and styling for this template. ===Parameters=== <templatedata> { "description": { "en": "Creates stylized and formatted links on the main page." }, "format": "inline", "params": { "1": { "label": { "en": "Text" }, "description": { "en": "The text to display. If the link parameter is not given, this will also be the link target." }, "example": "Stuff", "type": "string", "suggested": true }, "link": { "label": { "en": "Link" }, "description": { "en": "The target page for the link, if different than the display text." }, "required": false, "example": "Main Page", "type": "wiki-page-name" }, "image": { "label": { "en": "Image" }, "description": { "en": "An image to display with the link." }, "required": false, "suggested": true, "type": "wiki-file-name" }, "size": { "label": { "en": "Image size" }, "description": { "en": "The size of the image, in px." }, "required": false, "default": "42px", "type": "string" }, "imageClass": { "label": "Image class", "description": "A class to give directly to the image", "example": "invert-on-dark", "type": "string", "suggestedvalues": [ "invert-on-dark", "invert-on-light" ] }, "altText": { "label": "Alt text", "description": "Alt text to describe the image", "example": "Wiki logo", "type": "string", "suggested": true } }, "paramOrder": [ "1", "link", "image", "size", "imageClass", "altText" ] } </templatedata> ==Examples== <pre> <div class="mp-links columns-3"> * {{MP link|Stuff|link=Special:Random|image=Site-logo.png|size=42px}} * {{MP link|Things|link=Special:Random}} * {{MP link|Other stuff|link=Special:Random|image=Site-logo.png|size=42px}} </div> </pre> Produces: <div class="mp-links columns-3"> * {{MP link|Stuff|link=Special:Random|image=Site-logo.png|size=42px}} * {{MP link|Things|link=Special:Random}} * {{MP link|Other stuff|link=Special:Random|image=Site-logo.png|size=42px}} </div> <noinclude> [[Category:Template documentation]] </noinclude> 0df5d36904353428acb21882bd8923560f77a142 Template:Doc 10 24 32 2025-08-20T01:22:36Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Documentation]] 041222999c2c4765a4663432058f50686fb65f40 Template:Uses Lua 10 25 33 2025-08-20T01:22:36Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = darkblue | icon = Lua logo.svg | title= This template uses one or more modules written in the Lua programming language. | message = For more information, see [[wikipedia:Wikipedia:Lua|Wikipedia:Lua]] or the [[mw:Extension:Scribunto/Lua reference manual|Lua reference manual on mediawiki.org]]. Modules used include: {{#if:{{{1|}}}|{{#arraymap:{{{1|}}}|,|%s|'''[[Module:%s|%s]]'''}}|''None provided''}}. | tiny = {{{tiny|}}} | class = {{{class|}}} }}</includeonly><noinclude>{{doc|Template:Ambox/doc}}</noinclude> 1930c9b36136a5562cfaf7584f811d62b114a58a Template:Ambox 10 26 34 2025-08-20T01:22:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><div class="ambox {{{class|}}} {{#ifeq:{{lc:{{{tiny|}}}}}|yes|tiny}} noexcerpt"<!-- --> style="{{#if:{{{color|}}}|--ambox-color: {{{color|}}};<!-- /if -->}}"><!-- --><div class="ambox-icon metadata <!-- the metadata class stops it from showing in MediaViewer -->">[[File:{{{icon|Ambox banner content.svg}}}{{!}}{{#ifeq:{{lc:{{{tiny|}}}}}|yes|48x20px|48x48px}}|alt=|link=]]</div><!-- --><div class="ambox-content"><!-- start ambox content -->{{#if: {{{title|}}} | <p class="ambox-title">{{{title}}}</p> }}<!-- --><p class="ambox-text">{{{message|No text provided.}}}{{#if: {{{date|}}} |<nowiki> </nowiki>(Message added: {{{date}}}) }}</p><!-- --></div><!-- end ambox content --></div><!-- end ambox --></includeonly><noinclude> {{doc}} [[Category:Notice templates]]</noinclude> 11c1d0a1c9c2fcd4b89b27313303decfae03dea7 Template:(( 10 27 35 2025-08-20T01:22:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{<noinclude>{{documentation}}</noinclude> a506ba66cf7c806baae7faecb221b3a946721f6a Template:Tlx 10 28 36 2025-08-20T01:22:38Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Tl]] af3906f239c45d791753d3170c656eddd6d1af5f Template:Tl 10 29 37 2025-08-20T01:22:38Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#invoke:Template link|main|code=on}}</includeonly><noinclude> {{Documentation}} </noinclude> 1c13b1daaf7b7e8ce1e45cc03b4baf31c09bc6cd Template:Tl/doc 10 30 38 2025-08-20T01:22:39Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{From Wikipedia|Module:Template link general,Template:Tlx}} {{Uses Lua|Template link}} This template returns an exemplaric use of a template while linking to the template description page, if the template exists. == Usage == <pre> {{tl|<Template name>}} {{tl|<Template name>|<Template parameters>}} </pre> ; ''unnamed parameter'' 1 : Template name (without <code>Template:</code> prefix) ; ''unnamed parameter'' 2 - 9 : Optional. Template parameters ; nl : Optional flag to display an un-linked template usage. == Examples == : <code><nowiki>{{tl|stub}}</nowiki></code> returns {{tl|stub}} : <code><nowiki>{{tl|stub|1}}</nowiki></code> returns {{tl|stub|1}} : <code><nowiki>{{tl|stub|1|2|nl{{=}}y}}</nowiki></code> returns {{tl|stub|1|2|nl{{=}}y}} : <code><nowiki>{{tl|for|page|t1{{=}}alt text}}</nowiki></code> returns {{tl|for|page|t1{{=}}alt text}} == See also == <includeonly> [[Category:Formatting templates]] </includeonly><noinclude>[[Category:Template documentation]]</noinclude> 7cb4f0fa749ef8a18a48c4b5816357a225f4acee Template:Nowrap 10 31 39 2025-08-20T01:22:39Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <span class="nowrap">{{{1}}}</span><noinclude> {{documentation}} </noinclude> 8817bafce418a08a72f3425283fc03d04a2d8d44 Template:)) 10 32 40 2025-08-20T01:22:40Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki }}<noinclude> {{documentation}} </noinclude> 85ca77d4d6ff71d8e6396ebd798f87fa7f45dc02 Template:))/doc 10 33 41 2025-08-20T01:22:41Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:No wrap 10 34 42 2025-08-20T01:22:41Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Nowrap]] 269180d5083536bbbf72d889477805cfde7aac9e Template:Normal 10 35 43 2025-08-20T01:22:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <span style{{=}}"font-weight:normal; font-style:normal">{{{1}}}</span><noinclude> {{documentation}} </noinclude> f1d74e033cde1ce3b2efdc98b78fb863b8524fcf Template:((/doc 10 36 44 2025-08-20T01:22:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {| class="wikitable" style="text-align:center" |- ! scope="col" style="width:7.0em;" | {{no wrap|Template call}}<br>{{normal|('''m''' for magic word)}} ! scope="col" style="width:5.75em;" | {{no wrap|Output}}&nbsp;{{normal|(delayed interpretation as wikimarkup)}} ! scope="col" style="width:9.0em;" | {{no wrap|HTML alternative}} {{normal|(never interpreted as wikimarkup)}} ! Why you might want to use this |- style="vertical-align:top" | <code><nowiki>{{!}}</nowiki></code> '''(m)''' | <nowiki>|</nowiki> | &amp;#124; or {{tl|pipe}} | Displaying pipe characters inside of a parser function |- style="vertical-align:top" | <code><nowiki>{{=}}</nowiki></code> '''(m)''' | <nowiki>=</nowiki> | &amp;#61; | Displaying equal signs inside of unnamed parameters (e.g. <code><nowiki>{{MyTemplate|1+1=2}}</nowiki></code> will assign <code>2</code> to <code><nowiki>{{{1+1|}}}</nowiki></code>; <code><nowiki>{{MyTemplate|1+1{{=}}2}}</nowiki></code> will do what you want) |- style="vertical-align:top" | {{tlx|!!}} | <nowiki>||</nowiki> | &amp;#124;&amp;#124; | Displaying a break between two table cells inside of a parser function |- style="vertical-align:top" | {{tlx|!(}} | {{!(}} | &amp;#91; | Displaying a bracket inside of an external link |- style="vertical-align:top" | {{tlx|)!}} | {{)!}} | &amp;#93; | Displaying a bracket inside of an external link |- style="vertical-align:top" | {{tlx|!((}} | {{!((}} | &amp;#91;&amp;#91; | Displaying a bracket inside of a link |- style="vertical-align:top" | {{tlx|))!}} | {{))!}} | &amp;#93;&amp;#93; | Displaying a bracket inside of a link |- style="vertical-align:top" | {{tlx|(}} | {{(}} | &amp;#123; | Escaping a single brace immediately next to a template or parser function to avoid turning it into a parameter |- style="vertical-align:top" | {{tlx|)}} | {{)}} | &amp;#125; | Escaping a single brace immediately next to a template or parser function to avoid turning it into a parameter |- style="vertical-align:top" | {{tlx|((}} | {{((}} | &amp;#123;&amp;#123; | Displaying open braces for a template without actually transcluding that template |- style="vertical-align:top" | {{tlx|))}} | {{))}} | &amp;#125;&amp;#125; | Displaying closed braces for a template without actually transcluding that template |- style="vertical-align:top" | {{tlx|(((}} | {{(((}} | &amp;#123;&amp;#123;&amp;#123; | Displaying a template parameter's open curly braces without actually using that variable |- style="vertical-align:top" | {{tlx|)))}} | {{)))}} | &amp;#125;&amp;#125;&amp;#125; | Displaying a template parameter's closed curly braces without actually using that variable |- style="vertical-align:top" | {{tlx|(!}} | <nowiki>{|</nowiki> | &amp;#123;&amp;#124; | Starting a table inside of a parser function |- style="vertical-align:top" | {{tlx|!-}} | <nowiki>|-</nowiki> | &amp;#124;&amp;#45; | Starting a new table row inside of a parser function |- style="vertical-align:top" | {{tlx|!)}} | <nowiki>|}</nowiki> | &amp;#124;&amp;#125; | Closing a table inside of a parser function |}<includeonly> [[Category:Formatting templates]] </includeonly><noinclude>[[Category:Template documentation]]</noinclude> 9e1eb11bc0644d97b4cc9bc4445c3f0bacdd339d Template:!( 10 37 45 2025-08-20T01:22:43Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [<noinclude> {{documentation}}</noinclude> 1b058774deae9a7e511a0486a04647d6a3b9af62 Template:!(/doc 10 38 46 2025-08-20T01:22:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:)! 10 39 47 2025-08-20T01:22:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki ]<noinclude> {{documentation}}</noinclude> 016897dfd1af3b146bed2b47e7aa58c0bbf6f23d Template:)!/doc 10 40 48 2025-08-20T01:22:45Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:!(( 10 41 49 2025-08-20T01:22:46Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[<noinclude> {{documentation}}</noinclude> a331374acf15177afbb3ffc0ec7bd5ada14c582e Template:!((/doc 10 42 50 2025-08-20T01:22:46Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:))! 10 43 51 2025-08-20T01:22:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki ]]<noinclude> {{documentation}}</noinclude> 3d84066ce45d0c1fca0bb04608a4e73c6ea54324 Template:))!/doc 10 44 52 2025-08-20T01:22:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:Navbox 10 45 53 2025-08-20T01:22:48Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#invoke:Navbox|main}}</includeonly><noinclude>[[Category:Navigation templates]] {{documentation}}</noinclude> 11355a4514de8aa6c0ae686240591d267101c58c Template:Navbox/doc 10 46 54 2025-08-20T01:22:48Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{no direct use}} {{UsesLua|Navbox}} This template is designed to set up navigational templates relatively quickly with one or more lists of links. We highly recommend using this template for standardizing navigational templates and ease of use, especially for mobile devices. See [[support:RANGER navboxes|the support wiki]] for more information, including installation steps and further examples. == Basic example == The following example demonstrates the core functionality of this template: the title text, one standard link group, and one link group that contains two sub-groups. The rows are striped for easier readability. {{Navbox | title = Items | striped = even | group1 = Consumables | list1 = * Health Potion * Mana Potion | group2 = Weapons | group2.1 = Swords | list2.1 = * Wooden Sword * Rusted Sword * Steel Sword | group2.2 = Bows | list2.2 = * Shortbow * Crossbow * Longbow }} <syntaxhighlight lang="wikitext" style="overflow: auto;"> {{Navbox | template = <template_title> <!-- Required. e.g. `|template=Items` for template:Items --> | title = Items | striped = even | group1 = Consumables | list1 = * Health Potion * Mana Potion | group2 = Weapons | group2.1 = Swords | list2.1 = * Wooden Sword * Rusted Sword * Steel Sword | group2.2 = Bows | list2.2 = * Shortbow * Crossbow * Longbow }} </syntaxhighlight> == Parameters == === Main === The following parameters modify the navbox as a whole. {| class="wikitable" ! Parameter ! Description |- ! <code>template</code><br><code>name</code> | ('''Required''') Title of the template that the edit icon links to. e.g. <code>Items</code> for template:Items. |- ! <code>title</code> | Text that appears at the top of the navbox. |- ! <code>state</code><br><code>collapsible</code> | Controls if a navbox should be expanded or collapsed when the page loads. This only affects the whole navbox; if [[#Sections|sections]] are used, they are treated differently. * <code>expanded</code> ('''default''') - the navbox will start open and readers can collapse it. * <code>collapsed</code> - the navbox will start closed and readers can expand it. * <code>off</code>, <code>no</code>, or <code>plain</code> - the navbox will start open and cannot be collapsed. Advanced users can modify this on a page-by-page basis; see [[support:RANGER navboxes#Controlling the collapsible|the support wiki]] for more information. |- ! <code>editlinks</code> | Controls if an edit icon should be displayed at the top-left of the navbox, making it easier for users to interact with the template itself. * unset ('''default''') - displays the edit icon * <code>off</code> or <code>no</code> - hides the edit icon |- ! <code>above</code> | Text that appears above all list groups, directly below the title. |- ! <code>below</code> | Text that appears below all list groups, at the bottom of the navbox. |- ! <code>striped</code><br><code>evenodd</code> | Controls if the navbox rows should have zebra striping on even or odd rows, making it easier for users to distinguish two rows apart from each other. If [[#Sections|sections]] are used, each section resets the even/odd counter. *unset ('''default''') - all rows have the same background *<code>y</code>, <code>yes</code>, <code>on</code>, <code>striped</code>, or <code>even</code> - even-numbered rows are highlighted *<code>swap</code> or <code>odd</code> - odd-numbered rows are highlighted |} === Sections === The following parameters define sections within the navbox with their own titles. {| class="wikitable" ! Parameter ! Description |- ! <code>header''n''</code> | Text that appears at the top of the section, where ''n'' is any positive integer. If the value is set to two or more <code>-</code> (e.g. <code>--</code>, <code>-----</code>, etc.) the new section will have no header bar and cannot be collapsed. All groups and lists that are ''n'' or higher will appear in this section unless there is a higher <code>header''n''</code> later in the template. For example, if a navbox defines <code>header1</code> and <code>header4</code>, the first section will include <code>list1</code>, <code>list2</code>, and <code>list3</code> (and any of their sub-lists), while the second section will include all remaining lists starting at <code>list4</code> and their sub-lists. |- ! <code>header_state</code><br><code>state''n''</code> | <code>header_state</code> controls if all sections, by default, should be expanded or collapsed when the page loads. <code>state''n''</code> overrides <code>header_state</code> for the specific section defined by <code>header''n''</code> (where ''n'' is a matching integer). * <code>expanded</code> ('''default''') - the section will start open and readers can collapse it. * <code>collapsed</code> - the section will start closed and readers can expand it. * <code>off</code> or <code>plain</code> - the section will start open and cannot be collapsed. Advanced users can modify these on a page-by-page basis; see [[support:RANGER navboxes#Controlling the collapsible|the support wiki]] for more information. Both parameters have no effect on sections with headers set to two or more <code>-</code>, which are always expanded and cannot be collapsed. |} === List groups === The following parameters define the list groups. {| class="wikitable" ! Parameter ! Description |- ! <code>group''n''</code> | Text label for a list, which appears on the left on desktop or at the top on mobile, where ''n'' is any positive integer. This parameter is optional; if a <code>list''n''</code> does not have a matching <code>group''n''</code>, the list will take the full width on desktop. |- ! <code>list''n''</code> | A wikitext list, where ''n'' is any positive integer. |- ! <code>group''n''.''x''</code><br><code>group''n''.''x''.''y''</code><br>etc. | Text label for sub-lists that appear under <code>group''n''</code>, <code>group''n''.''x''</code>, etc. |- ! <code>list''n''.''x''</code><br><code>list''n''.''x''.''y''</code><br>etc. | Wikitext sub-lists. |} === Styling === The following parameters add inline styling or your custom CSS classes to specific elements of the navbox. To assist with text alignment, three default classes are available: <code>align-left</code>, <code>align-center</code>, and <code>align-right</code>. {| class="wikitable" ! Parameter ! Description |- ! <code>navbox_style</code><br><code>navbox_class</code> | Modifies the parent navbox element; <code>class</code> can be used as a shorthand for <code>navbox_class</code> Two default classes are available: *<code>pill</code> changes the links to pill-styled rather than dot-separated *<code>pill-mobile</code> only changes the links to pill-styled on mobile devices |- ! <code>title_style</code><br><code>title_class</code> | Modifies the title bar |- ! <code>above_style</code><br><code>above_class</code> | Modifies the <code>above</code> text row |- ! <code>below_style</code><br><code>below_class</code> | Modifies the <code>below</code> text row |- ! <code>header_style</code><br><code>header_class</code> | Modifies all section headers (''not'' the title bar) |- ! <code>header''n''_style</code><br><code>header''n''_class</code> | Modifies the specific section header ''n'' |- ! <code>section''n''_style</code><br><code>section''n''_class</code> | Modifies the container holding the section defined by a matching <code>header''n''</code> |- ! <code>group_style</code><br><code>group_class</code> | Modifies all base groups (<code>group''n''</code>), but ''not'' any subgroups (<code>group''n''.''x''</code>, etc.) |- ! <code>subgroup_style</code><br><code>subgroup_class</code> | Modifies all subgroups at all levels (<code>group''n''.''x''</code>, <code>group''n''.''x''.''y''</code>, etc.) |- ! <code>group''A''_style</code><br><code>group''A''_class</code> | Modifies the specific group ''A'', where ''A'' is any ''n'', ''n''.''x'', ''n''.''x''.''y'', etc. |- ! <code>list_style</code><br><code>list_class</code> | Modifies all lists. Note, in this context, "list" refers to the container of a <code>list''n''</code> parameter, not a <code>ul</code> or <code>ol</code> element inside the parameter |- ! <code>list''A''_style</code><br><code>list''A''_class</code> | Modifies the specific list ''A'', where ''A'' is any ''n'', ''n''.''x'', ''n''.''x''.''y'', etc. |} <noinclude>[[Category:Template documentation]]</noinclude> e35c990efd00644e63b9735d72ff65818357a1fb Template:( 10 47 55 2025-08-20T01:22:49Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {<noinclude> {{documentation}}</noinclude> 490a0c9c85eff213addd7272fe40f8627a637c75 Template:(/doc 10 48 56 2025-08-20T01:22:49Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:) 10 49 57 2025-08-20T01:22:50Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki }<noinclude> {{documentation}}</noinclude> 3bf19eb36f7371f1b4b61b8efbba67dfb0e8cfd4 Template:)/doc 10 50 58 2025-08-20T01:22:51Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:((( 10 51 59 2025-08-20T01:22:51Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{{<noinclude> {{documentation}}</noinclude> fa33084b57c1f33c82290de279827b973ab2fba8 Template:(((/doc 10 52 60 2025-08-20T01:22:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:))) 10 53 61 2025-08-20T01:22:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki }}}<noinclude> {{documentation}}</noinclude> 585d94f6fe636b77087dc0d06bfbe6cb69b29987 Template:)))/doc 10 54 62 2025-08-20T01:22:53Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:Documentation/doc 10 55 63 2025-08-20T01:22:53Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Use {{tl|documentation}} inside of the <code><nowiki><noinclude></noinclude></nowiki></code> section on your template. Then create your template at the <code>/doc</code> subpage of your template. <noinclude>[[Category:Template documentation]]</noinclude> 055b0481a1967951c59f15a09b92767c90baa8dd Template:License/CC-BY-NC-ND 10 56 64 2025-08-20T01:22:54Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC-ND | icon = [[File:CC-BY-NC-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nc-nd/3.0/|CC-BY-NC-ND]] | text = This file is under the [https://creativecommons.org/licenses/by-nc-nd/3.0/ Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC-ND}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 4ed8a6372d14a167dd9d26f1ae865b1593b76604 65 64 2025-08-20T01:22:55Z ARTIFICER 564804 Protected "[[Template:License/CC-BY-NC-ND]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC-ND | icon = [[File:CC-BY-NC-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nc-nd/3.0/|CC-BY-NC-ND]] | text = This file is under the [https://creativecommons.org/licenses/by-nc-nd/3.0/ Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC-ND}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 4ed8a6372d14a167dd9d26f1ae865b1593b76604 Template:License/CC-BY-SA 10 57 66 2025-08-20T01:22:55Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-SA | icon = [[File:CC-BY-SA.svg|x50px|link=https://creativecommons.org/licenses/by-sa/3.0/|CC-BY-SA]] | text = This file is under the [https://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-SA}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 1e471ba76ef084e99bff87e9356d439d400f73de 67 66 2025-08-20T01:22:55Z ARTIFICER 564804 Protected "[[Template:License/CC-BY-SA]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-SA | icon = [[File:CC-BY-SA.svg|x50px|link=https://creativecommons.org/licenses/by-sa/3.0/|CC-BY-SA]] | text = This file is under the [https://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-SA}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 1e471ba76ef084e99bff87e9356d439d400f73de Template:License/fairuse 10 58 68 2025-08-20T01:22:56Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = fairuse | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = This file is copyrighted. It will be used in a way that qualifies as fair use under [https://en.wikipedia.org/wiki/Fair_use#Fair_use_under_United_States_law US copyright law]. }}</includeonly><noinclude> This template currently looks like: {{License/fairuse}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 3662b685c4d9fa43d4f9342fae34b2f43ba925ef 69 68 2025-08-20T01:22:57Z ARTIFICER 564804 Protected "[[Template:License/fairuse]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = fairuse | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = This file is copyrighted. It will be used in a way that qualifies as fair use under [https://en.wikipedia.org/wiki/Fair_use#Fair_use_under_United_States_law US copyright law]. }}</includeonly><noinclude> This template currently looks like: {{License/fairuse}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 3662b685c4d9fa43d4f9342fae34b2f43ba925ef Template:License 10 59 70 2025-08-20T01:22:57Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/{{{1|nolicense}}}|source={{{source|}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 4b84fc940507f8fccb9c60b7f70b5a800a62fe59 71 70 2025-08-20T01:22:57Z ARTIFICER 564804 Protected "[[Template:License]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/{{{1|nolicense}}}|source={{{source|}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 4b84fc940507f8fccb9c60b7f70b5a800a62fe59 Template:License/CC-PD 10 60 72 2025-08-20T01:22:57Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-PD | icon = [[File:CC-PD.svg|x50px|link=|Public Domain]] | text = This file has been released into the public domain by the copyright holder, its copyright has expired, or it is ineligible for copyright. This applies worldwide. }}</includeonly><noinclude> This template currently looks like: {{License/CC-PD}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 23b76ae521833f5a34f0bf73426a53aad8fa9923 73 72 2025-08-20T01:22:58Z ARTIFICER 564804 Protected "[[Template:License/CC-PD]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-PD | icon = [[File:CC-PD.svg|x50px|link=|Public Domain]] | text = This file has been released into the public domain by the copyright holder, its copyright has expired, or it is ineligible for copyright. This applies worldwide. }}</includeonly><noinclude> This template currently looks like: {{License/CC-PD}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 23b76ae521833f5a34f0bf73426a53aad8fa9923 Template:License/CC-SRR 10 61 74 2025-08-20T01:22:58Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-SRR | icon = [[File:CC-SRR.svg|link=|CC-Some Rights Reserved]] | text = This file is under the Creative Commons Some Rights Reserved License. }}</includeonly><noinclude> This template currently looks like: {{License/CC-SRR}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 1ce36d04e501144e6a089ff194fee2b82732e85a 75 74 2025-08-20T01:22:59Z ARTIFICER 564804 Protected "[[Template:License/CC-SRR]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-SRR | icon = [[File:CC-SRR.svg|link=|CC-Some Rights Reserved]] | text = This file is under the Creative Commons Some Rights Reserved License. }}</includeonly><noinclude> This template currently looks like: {{License/CC-SRR}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 1ce36d04e501144e6a089ff194fee2b82732e85a Template:License/CC-BY 10 62 76 2025-08-20T01:22:59Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY | icon = [[File:CC-BY.svg|x50px|link=https://creativecommons.org/licenses/by/3.0/|CC-BY]] | text = This file is under the [https://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 49f4317b802ef04c92f4edc474581035768c252e 77 76 2025-08-20T01:22:59Z ARTIFICER 564804 Protected "[[Template:License/CC-BY]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY | icon = [[File:CC-BY.svg|x50px|link=https://creativecommons.org/licenses/by/3.0/|CC-BY]] | text = This file is under the [https://creativecommons.org/licenses/by/3.0/ Creative Commons Attribution 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 49f4317b802ef04c92f4edc474581035768c252e Template:License/CC-BY-ND 10 63 78 2025-08-20T01:23:00Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-ND | icon = [[File:CC-BY-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nd/3.0/|CC-BY-ND]] | text = This file is under the [https://creativecommons.org/licenses/by-nd/3.0/ Creative Commons Attribution-NoDerivs 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-ND}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> c77af748cb3aab2fce9bfd947149cb3e1ef0a3f0 79 78 2025-08-20T01:23:01Z ARTIFICER 564804 Protected "[[Template:License/CC-BY-ND]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-ND | icon = [[File:CC-BY-ND.svg|x50px|link=https://creativecommons.org/licenses/by-nd/3.0/|CC-BY-ND]] | text = This file is under the [https://creativecommons.org/licenses/by-nd/3.0/ Creative Commons Attribution-NoDerivs 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-ND}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> c77af748cb3aab2fce9bfd947149cb3e1ef0a3f0 Template:License/game 10 64 80 2025-08-20T01:23:01Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:rightsholder|<!-- *************************************** *************************************** Step 1/2 [required] Enter the name of the rightsholder, optionally with a link. Example without link: indie.io Example with a URL: [https://www.indie.io/ indie.io] Edit on the line below this************--> <!--Edit on the line above this******** *************************************** *************************************** -->}}<!-- continue to step 2 *************************************** *************************************** Step 2/2 [optional] Enter the TOS link. Example link: https://www.indie.io/terms-of-service -->{{#vardefine:tos|<!-- Edit on the line below this************--> <!--Edit on the line above this******** *************************************** *************************************** -->}}<!-- DON'T EDIT ANYTHING BELOW THIS -->{{License/template | source = {{{source|}}} | type = developer | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = {{#if:{{#var:rightsholder}}| <!-- Specific: -->This file is owned by {{#var:rightsholder}} and/or its licensors{{#if:{{#var:tos}}|, and is licensed under the {{#var:rightsholder}} [{{#var:tos}} Terms of Use]}}.<br/>All trademarks and registered trademarks present in the file are proprietary to {{#var:rightsholder}} and/or its licensors. | <!-- Generic: -->This file is owned by the applicable game studio and/or its licensors. }} }}</includeonly><noinclude> This template currently looks like: {{License/game}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> f1283ce43eda0d523b8e1f249ebc02470d957b34 81 80 2025-08-20T01:23:01Z ARTIFICER 564804 Protected "[[Template:License/game]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:rightsholder|<!-- *************************************** *************************************** Step 1/2 [required] Enter the name of the rightsholder, optionally with a link. Example without link: indie.io Example with a URL: [https://www.indie.io/ indie.io] Edit on the line below this************--> <!--Edit on the line above this******** *************************************** *************************************** -->}}<!-- continue to step 2 *************************************** *************************************** Step 2/2 [optional] Enter the TOS link. Example link: https://www.indie.io/terms-of-service -->{{#vardefine:tos|<!-- Edit on the line below this************--> <!--Edit on the line above this******** *************************************** *************************************** -->}}<!-- DON'T EDIT ANYTHING BELOW THIS -->{{License/template | source = {{{source|}}} | type = developer | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = {{#if:{{#var:rightsholder}}| <!-- Specific: -->This file is owned by {{#var:rightsholder}} and/or its licensors{{#if:{{#var:tos}}|, and is licensed under the {{#var:rightsholder}} [{{#var:tos}} Terms of Use]}}.<br/>All trademarks and registered trademarks present in the file are proprietary to {{#var:rightsholder}} and/or its licensors. | <!-- Generic: -->This file is owned by the applicable game studio and/or its licensors. }} }}</includeonly><noinclude> This template currently looks like: {{License/game}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> f1283ce43eda0d523b8e1f249ebc02470d957b34 Template:License/nolicense 10 65 82 2025-08-20T01:23:02Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = nolicense | icon = [[File:Warning-red.svg|50px|link=|No license has been selected.]] | text = Please select the proper license for this file by adding the proper parameter to <nowiki>{{License}}</nowiki>. See [[Template:License]] for details. }}</includeonly><noinclude> This template currently looks like: {{License/nolicense}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 9ddcfb97af577d7f8454e20f985b9456e7a95c77 83 82 2025-08-20T01:23:02Z ARTIFICER 564804 Protected "[[Template:License/nolicense]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = nolicense | icon = [[File:Warning-red.svg|50px|link=|No license has been selected.]] | text = Please select the proper license for this file by adding the proper parameter to <nowiki>{{License}}</nowiki>. See [[Template:License]] for details. }}</includeonly><noinclude> This template currently looks like: {{License/nolicense}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 9ddcfb97af577d7f8454e20f985b9456e7a95c77 Template:License/CC-BY-NC 10 66 84 2025-08-20T01:23:02Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC | icon = [[File:CC-BY-NC.svg|x50px|link=https://creativecommons.org/licenses/by-nc/3.0/|CC-BY-NC]] | text = This file is under the [https://creativecommons.org/licenses/by-nc/3.0/ Creative Commons Attribution-NonCommercial 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 535d8d725e53a0e8f94922ed597baed1353cec21 85 84 2025-08-20T01:23:03Z ARTIFICER 564804 Protected "[[Template:License/CC-BY-NC]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC | icon = [[File:CC-BY-NC.svg|x50px|link=https://creativecommons.org/licenses/by-nc/3.0/|CC-BY-NC]] | text = This file is under the [https://creativecommons.org/licenses/by-nc/3.0/ Creative Commons Attribution-NonCommercial 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 535d8d725e53a0e8f94922ed597baed1353cec21 Template:License/CC-BY-NC-SA 10 67 86 2025-08-20T01:23:03Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC-SA | icon = [[File:CC-BY-NC-SA.svg|x50px|link=https://creativecommons.org/licenses/by-nc-sa/3.0/|CC-BY-NC-SA]] | text = This file is under the [https://creativecommons.org/licenses/by-nc-sa/3.0/ Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC-SA}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 385fc8e61d98dd5ed6d4fa25b0eacf17cbca1218 87 86 2025-08-20T01:23:04Z ARTIFICER 564804 Protected "[[Template:License/CC-BY-NC-SA]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC-BY-NC-SA | icon = [[File:CC-BY-NC-SA.svg|x50px|link=https://creativecommons.org/licenses/by-nc-sa/3.0/|CC-BY-NC-SA]] | text = This file is under the [https://creativecommons.org/licenses/by-nc-sa/3.0/ Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC-BY-NC-SA}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 385fc8e61d98dd5ed6d4fa25b0eacf17cbca1218 Template:License/CC0 10 68 88 2025-08-20T01:23:04Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC0 | icon = [[File:CC-0.svg|x50px|link=https://creativecommons.org/publicdomain/zero/1.0/|CC0]] | text = This file is under the [https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC0}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> a6ae218b1382bcbe6f0e6e98ef272e4355dd7205 89 88 2025-08-20T01:23:04Z ARTIFICER 564804 Protected "[[Template:License/CC0]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = CC0 | icon = [[File:CC-0.svg|x50px|link=https://creativecommons.org/publicdomain/zero/1.0/|CC0]] | text = This file is under the [https://creativecommons.org/publicdomain/zero/1.0/ CC0 1.0 License]. }}</includeonly><noinclude> This template currently looks like: {{License/CC0}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> a6ae218b1382bcbe6f0e6e98ef272e4355dd7205 Template:License/doc 10 69 90 2025-08-20T01:23:04Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template is to be used under a ''Licensing'' heading on file pages to denote the file's license. == Available licenses == === Game === * Usage: <nowiki>{{License|game}}</nowiki> {{License|game}} === Fairuse === * Usage: <nowiki>{{License|fairuse}}</nowiki> {{License|fairuse}} === CC0 === * Usage: <nowiki>{{License|CC0}}</nowiki> {{License|CC0}} === CC-BY-NC-ND === * Usage: <nowiki>{{License|CC-BY-NC-ND}}</nowiki> {{License|CC-BY-NC-ND}} === CC-BY-NC-SA === * Usage: <nowiki>{{License|CC-BY-NC-SA}}</nowiki> {{License|CC-BY-NC-SA}} === CC-BY-NC === * Usage: <nowiki>{{License|CC-BY-NC}}</nowiki> {{License|CC-BY-NC}} === CC-BY-ND === * Usage: <nowiki>{{License|CC-BY-ND}}</nowiki> {{License|CC-BY-ND}} === CC-BY-SA === * Usage: <nowiki>{{License|CC-BY-SA}}</nowiki> {{License|CC-BY-SA}} === CC-BY === * Usage: <nowiki>{{License|CC-BY}}</nowiki> {{License|CC-BY}} === CC-PD === * Usage: <nowiki>{{License|CC-PD}}</nowiki> {{License|CC-PD}} === CC-SRR === * Usage: <nowiki>{{License|CC-SRR}}</nowiki> {{License|CC-SRR}} === Permission === * Usage: <nowiki>{{License|permission}}</nowiki> {{License|permission}} === No license === '''Providing no parameter (or invalid one) defaults to the nolicense notice:''' <nowiki>{{License}}</nowiki>{{License}} == Specifying source == '''Source parameter (optional):''' The source parameter accepts a url to the source where the file came from if necessary for attribution. Example: <nowiki>{{License|game|source=https://indie.io/}}</nowiki> {{License|game|source=https://indie.io/}} <includeonly> [[Category:License templates]] </includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 5b334ee591fa6a0867f5d8e685e580b5b6c21334 Template:License/Fairuse 10 70 91 2025-08-20T01:23:05Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:License/fairuse]] ecb7db41961bb5256d571593ca3f90ae1e199a3e Template:Clear 10 71 92 2025-08-20T01:23:05Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <div style="clear:{{{1|both}}};" class={{{class|}}}></div><noinclude> {{documentation}} </noinclude> 5b24b9fd5cc166a8c486e2422d5df465206ed39c Template:Ml 10 72 93 2025-08-20T01:23:06Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <code>{{[[Module:{{{1}}}|{{{1}}}]]}}<sup>m</sup>{{#if:{{{2|}}}|.{{{2}}}()}}</code><noinclude> * <code><nowiki>{{Ml|Infobox}}</nowiki></code> generates {{Ml|Infobox}}. * <code><nowiki>{{Ml|ArgsUtil|merge}}</nowiki></code> generates {{Ml|ArgsUtil|merge}}. [[Category:Formatting templates]] </noinclude> 0c69bf8d7c3319f1cf2aa68f4b80261257291560 Template:(! 10 73 94 2025-08-20T01:23:07Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {|<noinclude>{{documentation}}</noinclude> 86e51fe1f06ae532410029eb39fa936d68880bc8 Template:!- 10 74 95 2025-08-20T01:23:07Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki |-<noinclude>{{documentation}}</noinclude> 636f9e440c24f4a3fe28b49cebd1808c3de8a814 Template:!) 10 75 96 2025-08-20T01:23:08Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki |}<noinclude>{{documentation}}</noinclude> b2debea163716e114d1ea46e65a63d7a1ae84bc0 Template:(!/doc 10 76 97 2025-08-20T01:23:08Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:!-/doc 10 77 98 2025-08-20T01:23:09Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:!)/doc 10 78 99 2025-08-20T01:23:10Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:Pipe 10 79 100 2025-08-20T01:23:10Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki &#124;<noinclude>{{documentation}}</noinclude> 9d1875aa686e4e25a0994448a39d057e91541788 Template:Pipe/doc 10 80 101 2025-08-20T01:23:11Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:!! 10 81 102 2025-08-20T01:23:12Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki ||<noinclude>{{documentation}}</noinclude> 02fb31115eef5c15d6612ac334bf5a5d83155c0a Template:!!/doc 10 82 103 2025-08-20T01:23:17Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:License/template 10 83 104 2025-08-20T01:23:17Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><div class="license {{{type|}}}" style="border: 1px solid var(--wiki-content-border-color); background: var(--wiki-content-background-color--secondary); align-items: center; padding: 5px; display: flex; gap: 1em;"> <div class="icon {{#if:{{{darkIcon|}}}|invert-on-dark}}">{{{icon|}}}</div> <div class="text">{{{text|}}}{{#if:{{{source|}}}|<br/><span class="source">Source:&nbsp;{{{source|}}}</span>}}{{{text2|}}}</div> </div><!-- --></includeonly><noinclude>{{documentation|Template:License/doc}}</noinclude> 7d0e694e6a42a5368b4b62ce6c01bfa2fb4e67b8 105 104 2025-08-20T01:23:18Z ARTIFICER 564804 Protected "[[Template:License/template]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly><!-- --><div class="license {{{type|}}}" style="border: 1px solid var(--wiki-content-border-color); background: var(--wiki-content-background-color--secondary); align-items: center; padding: 5px; display: flex; gap: 1em;"> <div class="icon {{#if:{{{darkIcon|}}}|invert-on-dark}}">{{{icon|}}}</div> <div class="text">{{{text|}}}{{#if:{{{source|}}}|<br/><span class="source">Source:&nbsp;{{{source|}}}</span>}}{{{text2|}}}</div> </div><!-- --></includeonly><noinclude>{{documentation|Template:License/doc}}</noinclude> 7d0e694e6a42a5368b4b62ce6c01bfa2fb4e67b8 Template:* 10 84 106 2025-08-20T01:23:18Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki &nbsp;&bull;&nbsp;<noinclude> {{doc}} [[Category:Formatting templates]] </noinclude> 81a7f0051da7b8f4a0548d91c5eb429a974fac91 Template:*/doc 10 85 107 2025-08-20T01:23:19Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This is the '''bullet''' template; it looks like this: [&nbsp;&bull;&nbsp;] It works similarly to the HTML markup sequence: [<code>'''&amp;nbsp;&amp;bull;&amp;nbsp;'''</code>], that is, a non-breaking space, a bullet and a non-breaking space. This template is used when you want a larger bullet than a bold middot ['''&middot;'''], but something smaller than an en dash [&ndash;]. <noinclude>[[Category:Template documentation]]</noinclude> ea04fe63a10dc333ed9c48bfc397debb11682f1e Template:Key 10 86 108 2025-08-20T01:23:20Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:platform | {{#if: {{{2|}}} | {{#switch: {{lc:{{{1|}}}}} <!-- Desktop --> |mouse |keyboard=keyboard <!-- Mobile --> |gesture=gesture <!-- Microsoft --> |xboxseries |xbox=Xbox |xbox one |xbone |xbox1 |xboxone=xboxone |xbox 360 |xb360 |xbox360 |360=360 <!-- Sony --> |ps |ps5 |playstation |ds |dualsense=DualSense |playstation 4 |ps4=PS4 |playstation 3 |ps3=ps3 <!-- Nintendo --> |ns |switch=Switch |wii=wii }} | undefined }} }}<!-- -->{{#vardefine:key | {{#if: {{{2|}}} | {{ucfirst:{{{2}}}}} | {{ucfirst:{{{1}}}}} }} }}<!-- -->{{#vardefine:img | {{#if: {{{2|}}} | [[File:{{#var:platform}} {{#var:key}}.png|x25px|link=]] }} | Undefined }}<!-- --><span class="key">{{#var:img}}</span><!-- --></includeonly><!-- --><noinclude>{{doc}}</noinclude> 45576cb62a8104687b5b7ac26b042283c80ecae6 Template:Key/doc 10 87 109 2025-08-20T01:23:20Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <tabber> |-|Desktop={{:Template:Key/doc/Keyboard}} |-|Mobile={{:Template:Key/doc/Gesture}} |-|Xbox={{:Template:Key/doc/Xbox}} |-|DualSense={{:Template:Key/doc/DualSense}} |-|PlayStation 4={{:Template:Key/doc/PS4}} |-|Nintendo Switch={{:Template:Key/doc/Nintendo Switch}} </tabber> <noinclude>[[Category:Key template documentation]]</noinclude> 19eb9be1ca2c7112f63dd11c58d3888327dcca75 Template:Key/doc/Gesture 10 88 110 2025-08-20T01:23:21Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Images source: [[dev:Category:Gesture input images]] === Fingers === <code><nowiki>{{key|gesture|Finger Front}}</nowiki></code> {{key|gesture|Finger Front}} <code><nowiki>{{key|gesture|Finger Side}}</nowiki></code> {{key|gesture|Finger Side}} === Tap & hold === <code><nowiki>{{key|gesture|Tap}}</nowiki></code> {{key|gesture|Tap}} <code><nowiki>{{key|gesture|Double Tap}}</nowiki></code> {{key|gesture|Double Tap}} <code><nowiki>{{key|gesture|Hold}}</nowiki></code> {{key|gesture|Hold}} === Swipe motions === <code><nowiki>{{key|gesture|Swipe Bottom Left}}</nowiki></code> {{key|gesture|Swipe Bottom Left}} <code><nowiki>{{key|gesture|Swipe Bottom Right}}</nowiki></code> {{key|gesture|Swipe Bottom Right}} <code><nowiki>{{key|gesture|Swipe Down}}</nowiki></code> {{key|gesture|Swipe Down}} <code><nowiki>{{key|gesture|Swipe Left}}</nowiki></code> {{key|gesture|Swipe Left}} <code><nowiki>{{key|gesture|Swipe Right}}</nowiki></code> {{key|gesture|Swipe Right}} <code><nowiki>{{key|gesture|Swipe Top Left}}</nowiki></code> {{key|gesture|Swipe Top Left}} <code><nowiki>{{key|gesture|Swipe Top Right}}</nowiki></code> {{key|gesture|Swipe Top Right}} <code><nowiki>{{key|gesture|Swipe Up}}</nowiki></code> {{key|gesture|Swipe Up}} === Zoom & scroll === <code><nowiki>{{key|gesture|Zoom In}}</nowiki></code> {{key|gesture|Zoom In}} <code><nowiki>{{key|gesture|Zoom Out}}</nowiki></code> {{key|gesture|Zoom Out}} <code><nowiki>{{key|gesture|Scroll Down}}</nowiki></code> {{key|gesture|Scroll Down}} <code><nowiki>{{key|gesture|Scroll Left}}</nowiki></code> {{key|gesture|Scroll Left}} <code><nowiki>{{key|gesture|Scroll Right}}</nowiki></code> {{key|gesture|Scroll Right}} <code><nowiki>{{key|gesture|Scroll Up}}</nowiki></code> {{key|gesture|Scroll Up}} === Circular motions === <code><nowiki>{{key|gesture|Double Rotate}</nowiki></code> {{key|gesture|Double Rotate}} <code><nowiki>{{key|gesture|Full Circle}}</nowiki></code> {{key|gesture|Full Circle}} <code><nowiki>{{key|gesture|Half Circle}}</nowiki></code> {{key|gesture|Half Circle}} <code><nowiki>{{key|gesture|Quarter Circle}}</nowiki></code> {{key|gesture|Quarter Circle}} __NOTOC__ <noinclude>[[Category:Key template documentation]]</noinclude> 0a595b125cc6dbd6ad531c1e989d1929eaf1c6e2 Template:Key/doc/PS4 10 89 111 2025-08-20T01:23:21Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Images source: [[dev:Category:PS4 input images]] === D-pad & sticks === <code><nowiki>{{key|PS4|Dpad}}</nowiki></code> {{key|PS4|Dpad}} <code><nowiki>{{key|PS4|Left}}</nowiki></code> {{key|PS4|Left}} <code><nowiki>{{key|PS4|Right}}</nowiki></code> {{key|PS4|Right}} <code><nowiki>{{key|PS4|Up}}</nowiki></code> {{key|PS4|Up}} <code><nowiki>{{key|PS4|Down}}</nowiki></code> {{key|PS4|Down}} <code><nowiki>{{key|PS4|Left Stick}}</nowiki></code> {{key|PS4|Left Stick}} <code><nowiki>{{key|PS4|Right Stick}}</nowiki></code> {{key|PS4|Right Stick}} <code><nowiki>{{key|PS4|Touch Pad}}</nowiki></code> {{key|PS4|Touch Pad}} === Front buttons === <code><nowiki>{{key|PS4|Circle}}</nowiki></code> {{key|PS4|Circle}} <code><nowiki>{{key|PS4|Cross}}</nowiki></code> {{key|PS4|Cross}} <code><nowiki>{{key|PS4|Square}}</nowiki></code> {{key|PS4|Square}} <code><nowiki>{{key|PS4|Triangle}}</nowiki></code> {{key|PS4|Triangle}} <code><nowiki>{{key|PS4|Share}}</nowiki></code> {{key|PS4|Share}} <code><nowiki>{{key|PS4|Options}}</nowiki></code> {{key|PS4|Options}} === Rear buttons === <code><nowiki>{{key|PS4|L1}}</nowiki></code> {{key|PS4|L1}} <code><nowiki>{{key|PS4|R1}}</nowiki></code> {{key|PS4|R1}} <code><nowiki>{{key|PS4|L2}}</nowiki></code> {{key|PS4|L2}} <code><nowiki>{{key|PS4|R2}}</nowiki></code> {{key|PS4|R2}} <noinclude>[[Category:Key template documentation]]</noinclude> 1672e7f0dcd4db09545c96936cfbabcab681cfeb Template:Key/doc/Nintendo Switch 10 90 112 2025-08-20T01:23:22Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Images source: [[dev:Category:Nintendo Switch input images]] === Nintendo Switch === <code><nowiki>{{Key|Switch|a}}</nowiki></code> {{Key|Switch|a}} <code><nowiki>{{Key|Switch|b}}</nowiki></code> {{Key|Switch|b}} <code><nowiki>{{Key|Switch|x}}</nowiki></code> {{Key|Switch|x}} <code><nowiki>{{Key|Switch|y}}</nowiki></code> {{Key|Switch|y}} <code><nowiki>{{Key|Switch|Left Stick}}</nowiki></code> {{Key|Switch|Left Stick}} <code><nowiki>{{Key|Switch|Right Stick}}</nowiki></code> {{Key|Switch|Right Stick}} <code><nowiki>{{Key|Switch|Left Stick Press}}</nowiki></code> {{Key|Switch|Left Stick Press}} <code><nowiki>{{Key|Switch|Right Stick Press}}</nowiki></code> {{Key|Switch|Right Stick Press}} <code><nowiki>{{Key|Switch|-}}</nowiki></code> {{Key|Switch|-}} <code><nowiki>{{Key|Switch|+}}</nowiki></code> {{Key|Switch|+}} <code><nowiki>{{Key|Switch|Capture}}</nowiki></code> {{Key|Switch|Capture}} <code><nowiki>{{Key|Switch|HOME}}</nowiki></code> {{Key|Switch|HOME}} <code><nowiki>{{Key|Switch|L}}</nowiki></code> {{Key|Switch|L}} <code><nowiki>{{Key|Switch|R}}</nowiki></code> {{Key|Switch|R}} <code><nowiki>{{Key|Switch|ZL}}</nowiki></code> {{Key|Switch|ZL}} <code><nowiki>{{Key|Switch|ZR}}</nowiki></code> {{Key|Switch|ZR}} === Pro Controller === <code><nowiki>{{Key|Switch|Pro Control Pad}}</nowiki></code> {{Key|Switch|Pro Control Pad}} <code><nowiki>{{Key|Switch|Pro Control Pad Left}}</nowiki></code> {{Key|Switch|Pro Control Pad Left}} <code><nowiki>{{Key|Switch|Pro Control Pad Right}}</nowiki></code> {{Key|Switch|Pro Control Pad Right}} <code><nowiki>{{Key|Switch|Pro Control Pad Up}}</nowiki></code> {{Key|Switch|Pro Control Pad Up}} <code><nowiki>{{Key|Switch|Pro Control Pad Down}}</nowiki></code> {{Key|Switch|Pro Control Pad Down}} === Joy-Con === <code><nowiki>{{Key|Switch|Directional Left}}</nowiki></code> {{Key|Switch|Directional Left}} <code><nowiki>{{Key|Switch|Directional Right}}</nowiki></code> {{Key|Switch|Directional Right}} <code><nowiki>{{Key|Switch|Directional Up}}</nowiki></code> {{Key|Switch|Directional Up}} <code><nowiki>{{Key|Switch|Directional Down}}</nowiki></code> {{Key|Switch|Directional Down}} ==== Diagrams ==== <code><nowiki>{{Key|Switch|Joy-Con}}</nowiki></code> {{Key|Switch|Joy-Con}} <code><nowiki>{{Key|Switch|Joy-Con Separate}}</nowiki></code> {{Key|Switch|Joy-Con Separate}} <code><nowiki>{{Key|Switch|Joy-Con Left}}</nowiki></code> {{Key|Switch|Joy-Con Left}} <code><nowiki>{{Key|Switch|Joy-Con Right}}</nowiki></code> {{Key|Switch|Joy-Con Right}} __NOTOC__ <noinclude>[[Category:Key template documentation]]</noinclude> 34ef402e3bd539920ee4247d68882ecb53fc6eda Template:Spoiler 10 91 113 2025-08-20T01:23:23Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- Base code written for Terraria Wiki: https://terraria.wiki.gg/wiki/Template:Spoiler NOTE: This template needs a JavaScript function in MediaWiki:Common.js or MediaWiki:Vector.js to work, as well as styling in MediaWiki:Common.css or MediaWiki:Vector.css for the related classes -->{{#vardefine:element|{{#if:{{{block|}}}|div|span}}}}<!-- -->{{#tag:{{#var:element}}|{{#tag:{{#var:element}}|{{{1|}}}}}|class=spoiler-content {{{class|}}}|id={{{id|}}}|style={{{css|{{{style|}}}}}} }}<!-- -->[[Category:Pages with spoilers]]<!-- --></includeonly><noinclude> {{doc}} [[Category:Formatting templates]] </noinclude> 2da5f6bb4ec1204941f5ba21a2196cd35eccdb23 Template:Spoiler/doc 10 92 114 2025-08-20T01:23:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template is used to mark text and other elements as spoilers. Users can click or optionally hover to reveal their content. == The hoverShowSpoilers gadget == Users can enable the <code>[[MediaWiki:Gadgets/hoverShowSpoilers|hoverShowSpoilers]]</code> gadget to make spoilers show on hover, not just on click. The code for this gadget can be found at [[MediaWiki:Gadgets/hoverShowSpoilers/main.css]]. == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{spoiler|spoiler text}}</nowiki></code> (Click to toggle) || {{spoiler|spoiler text}} |- | <code><nowiki>{{spoiler|spoiler text with a [[Template:Navbox|link]]}}</nowiki></code> (Click to toggle) || {{spoiler|spoiler text with a [[Template:Navbox|link]]}} |- | <pre> {{spoiler|block=y|Really long spoiler that spans multiple lines It even has a bulleted list inside it: * Item a * Item b * [[Special:Random|Item c]] }}</pre> |{{spoiler|block=y|Really long spoiler that spans multiple lines It even has a bulleted list inside it: * Item a * Item b * [[Special:Random|Item c]] }} |} == Dependencies == For this template to work properly, you need the following: * The <code>spoilers</code> gadget with JavaScript code for toggling the <code>.spoiler</code> class on/off on click: ** [[MediaWiki:Gadgets/spoilers]] ** [[MediaWiki:Gadgets/spoilers/main.js]] * The <code>.spoiler-content</code> and any related classes, found in [[MediaWiki:Common.css]]. == Source == Base code adapted from [[wgg:terraria:Template:Spoiler|Template:Spoiler on Terraria Wiki]]. ==TemplateData== <templatedata> { "params": { "1": { "aliases": [ "text" ], "label": "Text", "description": "The text to be shown.", "example": "Character A died during the battle.", "type": "content", "required": true }, "hover": { "label": "Show on Hover?", "description": "Show spoiler text on mouse hover.", "example": "hover=yes", "type": "boolean", "default": "hover=no" }, "block": { "label": "Display as block?", "description": "If given, display the spoiler as a block instead of inline. Useful for long spoilers spanning multiple lines or using block-level elements like lists.", "example": "y", "type": "boolean", "suggested": true }, "class": { "label": "Class", "description": "A class or classes to apply to the spoiler", "type": "string" }, "id": { "label": "ID", "description": "A CSS ID to apply to the spoiler.", "type": "string" }, "style": { "description": "Inline CSS styles to pass in.", "type": "string", "aliases": [ "css" ], "label": "Style" } }, "description": "This template can be used to mark text as a spoiler.", "maps": { "1": {} }, "paramOrder": [ "1", "hover", "block", "class", "id", "style" ], "format": "inline" } </templatedata> <noinclude>[[Category:Template documentation]]</noinclude> bae231a84e57129ec12ba47e554ed42e76c185e0 Template:Link icon 10 93 115 2025-08-20T01:23:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#vardefine:target|{{{1|}}}<!-- end vd -->}}<!-- -->{{#vardefine:display|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}<!-- end if -->}}<!-- end vd -->}}<!-- -->{{#vardefine:iconSize|1.2em}}<!-- -->{{#vardefine:lineHeight|1lh}}<!-- -->{{#vardefine:fileExists|{{filepath:{{#var:target}} ({{{type}}}).png}}}}<!-- -->{{#ifeq: {{{2|}}} | notext <!-- start if notext -->|<span class="link-icon notext" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start notext icon element -->{{#if: {{#var:fileExists}} <!-- start icon if -->| <span class="regular">[[File:{{#var:target}} ({{{type}}}).png|link={{#var:target}}|alt=]]</span><!-- end regular icon -->| <span class="fallback">[[File:{{{1}}} ({{{type}}}).png|?]]</span><!-- end fallback icon (?) -->}}<!-- end icon if --></span><!-- end notext icon -->|<span class="link-icon" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start icon + text element -->{{#if: {{#var:fileExists}} <!-- start icon if -->| <span class="regular">[[File:{{#var:target}} ({{{type}}}).png|link={{#var:target}}|alt=]]</span><!-- end regular icon -->| <span class="fallback">[[File:{{{1}}} ({{{type}}}).png|?]]</span><!-- end fallback icon (?) -->}}&nbsp;<!-- end icon if --><span class="display-text">[[{{#var:target}}|{{#var:display}}]]</span><!-- end display text --></span> <!-- end icon + text element -->}}<!-- end if notext --></includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude> a8fc86aa3dc0f0085e5d1236a47e8d04e8685684 Template:Link icon/doc 10 94 116 2025-08-20T01:23:25Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{No direct use}} == List of link icon templates == * {{tl|Character icon}} * {{tl|Item icon}} == Dependencies== For this template to work properly, you need the following: * The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]]. <noinclude>[[Category:Template documentation]]</noinclude> 654dfb540ea31a810ef53c3820862942e63b2e8a Template:I 10 95 117 2025-08-20T01:23:25Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Link icon]] 6ebdedb4de95efaa3e6ca27590e79aca674f2364 Template:Quote 10 96 118 2025-08-20T01:23:26Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><div class="quote"><!-- start quote wrapper --><div class="marks-wrapper"><!-- start marks wrapper --><div class="block"><!-- start quote block -->{{#if:{{{title|}}}|<div class="title">{{{title}}}</div>|}}<!-- -->{{#if:{{{text|{{{1|}}}}}}|<div class="text">{{{text|{{{1|}}}}}}</div>|}}<!-- --></div><!-- end quote block --></div><!-- end marks wrapper -->{{#if:{{{author|{{{2|}}}}}}|<div class="author">― {{#if:{{{authorpage|}}}| [[{{{authorpage}}}|{{{author|{{{2|}}}}}}]] | {{{author|{{{2|}}}}}} }}</div>|}}<!-- --></div><!-- -->[[Category:Pages with quotes]]</includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude> 095258ceee92819a4e7b83c26fba3761bf9c41a9 Template:Item icon 10 97 119 2025-08-20T01:23:26Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Link icon|{{{1|}}}|{{{2|}}}|type=Item}}</includeonly><noinclude>{{documentation}}[[Category:Formatting templates]]</noinclude> 6564279e3808e659b8034ad4b96f4f9e9e498b57 Template:Item icon/doc 10 98 120 2025-08-20T01:23:27Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki == Summary == <templatedata> { "params": { "1": { "aliases": [ "page" ], "label": "Page Name", "description": "The name for the target page.", "example": "Page Name", "type": "wiki-page-name", "required": true }, "2": { "aliases": [ "label" ], "label": "Link Label", "description": "The text to the be displayed on the link icon's label.", "example": "Alternative Page Name", "type": "line" } }, "description": "Use this template to display an icon next to a page link.\n\nThis template assumes that each page has an icon uploaded at a specific location, namely \"File:Page Name (Item).png\".", "format": "inline" } </templatedata> == Examples == For the examples below, <code><nowiki>File:Mystic Feather (Item).png</nowiki></code> was used as the icon for a page called <code>Mystic Feather</code>. {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Item icon|Mystic Feather}}</nowiki></code> || {{Item icon|Mystic Feather}} |- | <code><nowiki>{{Item icon|Mystic Feather|Mystic Feathers}}</nowiki></code> || {{Item icon|Mystic Feather|Mystic Feathers}} |- | <code><nowiki>{{Item icon|Mystic Feather|notext}}</nowiki></code> || {{Item icon|Mystic Feather|notext}} |- | <code><nowiki>{{Item icon|Missing Item}}</nowiki></code> (Missing Page Icon) || {{Item icon|Missing Item}} |} == Dependencies== For this template to work properly, you need the following: * The base {{tl|Link icon}} template. * The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]]. 4dfcab6f3d3c88596068607685645f29666f0141 Template:Character icon 10 99 121 2025-08-20T01:23:28Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Link icon|{{{1|}}}|{{{2|}}}|type=Character}}</includeonly><noinclude>{{documentation}}[[Category:Formatting templates]]</noinclude> 24bad84fd5dea93cab210dfd592fda86af09eb87 Template:Character icon/doc 10 100 122 2025-08-20T01:23:28Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki == Summary == <templatedata> { "params": { "1": { "aliases": [ "page" ], "label": "Page Name", "description": "The name for the target page.", "example": "Page Name", "type": "wiki-page-name", "required": true }, "2": { "aliases": [ "label" ], "label": "Link Label", "description": "The text to the be displayed on the link icon's label.", "example": "Alternative Page Name", "type": "line" } }, "description": "Use this template to display an icon next to a page link.\n\nThis template assumes that each page has an icon uploaded at a specific location, namely \"File:Page Name (Character).png\".", "format": "inline" } </templatedata> == Examples == For the examples below, <code><nowiki>File:Invisible Boy (Character).png</nowiki></code> was used as the icon for a page called <code>Invisible Boy</code>. {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Character icon|Invisible Boy}}</nowiki></code> || {{Character icon|Invisible Boy}} |- | <code><nowiki>{{Character icon|Invisible Boy|The Invisible Boy}}</nowiki></code> || {{Character icon|Invisible Boy|The Invisible Boy}} |- | <code><nowiki>{{Character icon|Invisible Boy|notext}}</nowiki></code> || {{Character icon|Invisible Boy|notext}} |- | <code><nowiki>{{Character icon|Missing Boy}}</nowiki></code> (Missing Page Icon) || {{Character icon|Missing Boy}} |} == Dependencies== For this template to work properly, you need the following: * The base {{tl|Link icon}} template. * The <code>.link-icon</code> class and any related classes, found in [[MediaWiki:Common.css]]. 0999a706143c16f5ed970816e7825239cfce9547 Template:Quote/doc 10 101 123 2025-08-20T01:23:29Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki == Examples == {| class="wikitable" ! Code !! Result |- | <pre>{{Quote|text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre> | {{Quote|text=Now is the winter of our discontent made glorious summer by this sun of York}} |- | <pre>{{Quote |title=Opening lines of ''Richard III'' |text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre> | {{Quote |title=Opening lines of ''Richard III'' |text=Now is the winter of our discontent made glorious summer by this sun of York}} |- | <pre>{{Quote |title=Opening lines of ''Richard III'' |author=William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre> | {{Quote |title=Opening lines of ''Richard III'' |author=William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}} |- | <pre>{{Quote |title=Opening lines of ''Richard III'' |author=William Shakespeare |authorpage=wikipedia:William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre> | {{Quote |title=Opening lines of ''Richard III'' |author=William Shakespeare |authorpage=wikipedia:William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}} |- | <pre>{{Quote |author=William Shakespeare |authorpage=wikipedia:William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}}</pre> | {{Quote |author=William Shakespeare |authorpage=wikipedia:William Shakespeare |text=Now is the winter of our discontent made glorious summer by this sun of York}} |} == Dependencies == For this template to work properly, you need the following: * The <code>.quote</code> and any related classes, found in [[MediaWiki:Common.css]]. <noinclude>[[Category:Template documentation]]</noinclude> == Template data (for Visual Editor) == <templatedata> { "params": { "title": { "label": "Title", "description": "If the quote has a title, put it here.", "example": "Richard III's soliloquy", "type": "line" }, "text": { "label": "Quoted Text", "description": "The quoted text to be displayed.", "example": "Now is the winter of our discontent made glorious summer by this sun of York", "type": "string", "required": true }, "author": { "label": "Quote's Author", "description": "The author of the displayed quote.", "example": "William Shakespeare", "type": "line", "suggested": true }, "authorpage": { "label": "Author's Page", "description": "If the quote's author has a page on the Wiki, put the page name here.", "example": "William Shakespeare (playwright)", "type": "wiki-page-name", "suggested": true } }, "description": "This template creates a styled block element for quotes.", "paramOrder": [ "text", "author", "authorpage", "title" ], "format": "block" } </templatedata> 8a10e77de70ff704435282ce0f2ba792a13404a5 Template:Hatnote 10 102 124 2025-08-20T01:23:29Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->[[Category:Pages with hatnotes]]<!-- --><div class="hatnote {{#if:{{{icon|}}}|icon}} noexcerpt">{{#if:{{{icon|}}}|[[File:{{{icon}}}|x22px]]<nowiki> </nowiki>}}{{{1|}}}</div><!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates| ]]</noinclude> 7d46b899835bfd29a8fbee088499bc7a6acb2587 Template:Hatnote/doc 10 103 125 2025-08-20T01:23:30Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{No direct use}} == List of hatnote templates == * {{tl|Disambiguation}} * {{tl|Distinguish}} * {{tl|For}} * {{tl|Main}} == Dependencies == For this template to work properly, you need the following: * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. * The <code>--wiki-content-border-color--secondary</code> CSS variable, defined in [[MediaWiki:Common.css]]. <noinclude>[[Category:Template documentation]]</noinclude> 464f2f866befaf4cfa47f68ab0ad4f170c13463d Template:Disambiguation (wiki.gg)/doc 10 104 126 2025-08-20T01:23:31Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Disambiguation Page", "description": "A custom disambiguation page name.", "example": "Disambiguation Page", "type": "wiki-page-name" }, "2": { "label": "Link Label", "description": "A label for the custom disambiguation page.", "example": "Alternative Page Name", "type": "line" }, "topic": { "label": "Custom Topic", "description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic", "example": "a custom topic", "default": "{{PAGENAME}}", "type": "line" } }, "description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.", "paramOrder": [ "1", "2", "topic" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Disambiguation}}</nowiki></code> || {{Disambiguation|topic=Example}} |- | <code><nowiki>{{Disambiguation|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation|Special:Random|topic=Example}} |- | <code><nowiki>{{Disambiguation|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation|Special:Random|Page Label|topic=this particular topic}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]]. <noinclude>[[Category:Template documentation]]</noinclude> 5fce9c689120c57454571ff0e60a2cd447df5713 Template:Disambiguation (wiki.gg) 10 105 127 2025-08-20T01:23:31Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:topic|<!-- start vd -->{{#if:{{{topic|}}} | {{{topic}}} | {{PAGENAME}} }}<!-- end if -->}}<!-- end vd -->{{#vardefine:disambig|<!-- start vd -->{{#if:{{{1|}}}<!-- start custom disambig if -->|{{{1}}}<!-- start label if -->{{#if:{{{2|}}} | {{!}}{{{2}}} }}<!-- end label if -->|{{#var:topic}} (disambiguation)<!-- else; use regular disambig -->}}<!-- end custom disambig if -->}}<!-- end vd -->{{Hatnote|<!-- -->This page is about '''{{#var:topic}}'''. For other uses, see [[{{#var:disambig}}]].<!-- -->|icon=Disambig.svg<!-- -->}}<!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude> c4c62e7a1876492eb970ea182cf4ac0bcad97913 Template:Distinguish 10 106 128 2025-08-20T01:23:32Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:text|<!-- start vd -->{{#if:{{{text|}}} | {{{text}}} |<!-- start top if -->{{#if:{{{2|}}}<!-- if more than one page -->|[[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if -->|, [[{{{2}}}]] or [[{{{3}}}]]<!-- concat two -->|<nowiki> </nowiki>or [[{{{2}}}]]<!-- else; concat one -->}}<!-- end concat if -->|[[{{{1}}}]]<!-- else; one page only -->}}<!-- end custom disambig if -->}}<!-- end if -->}}<!-- end vd -->{{Hatnote|<!-- -->Not to be confused with {{#var:text}}.<!-- -->}}<!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude> 67ae5406ffd29bec56cfe7ad6527bb09a9733496 Template:Distinguish/doc 10 107 129 2025-08-20T01:23:32Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Alternative", "description": "The alternative page.", "example": "Alternative Page", "type": "wiki-page-name", "suggested": true }, "2": { "label": "Second Alternative", "description": "A second alternative page.", "example": "Second Alternative Page", "type": "wiki-page-name" }, "3": { "label": "Third Alternative", "description": "A third alternative page.", "example": "Third Alternative Page", "type": "wiki-page-name" }, "text": { "label": "Alternative Text", "description": "Instead of using pages, you can provide a full alternative text. This parameter overrides other provided parameters.", "example": "the alternative page, [[Alternative Page]]", "type": "line" } }, "description": "This hatnote template is meant to be used to indicate possible alternatives to what the reader wants to find.", "paramOrder": [ "1", "2", "3", "text" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Distinguish|Special:Uncategorizedpages}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages}} |- | <code><nowiki>{{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles}} |- | <code><nowiki>{{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles|Special:Uncategorizedcategories}}</nowiki></code> || {{Distinguish|Special:Uncategorizedpages|Special:Uncategorizedfiles|Special:Uncategorizedcategories}} |- | <code><nowiki>{{Distinguish|Special:Uncategorizedpages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{Distinguish|Special:Uncategorizedpages{{!}}Page 1}} |- | <code><nowiki>{{Distinguish|text = Page 1, another name for [[Special:Uncategorizedpages]]}}</nowiki></code> || {{Distinguish|text = Page 1, another name for [[Special:Uncategorizedpages]]}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:Distinguish|Wikipedia's Distinguish Template]]. <noinclude>[[Category:Template documentation]]</noinclude> 2a06ed576ae6479add20834628f9378c657cb4fb Template:For 10 108 130 2025-08-20T01:23:33Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:text|<!-- start vd -->{{#if:{{{3|}}}<!-- if more than one page -->|[[{{{2}}}]]{{#if:{{{4|}}}<!-- start concat if -->|, [[{{{3}}}]] and [[{{{4}}}]]<!-- concat two -->|<nowiki> </nowiki>and [[{{{3}}}]]<!-- else; concat one -->}}<!-- end concat if -->|[[{{{2}}}]]<!-- else; one page only -->}}<!-- end if -->}}<!-- end vd -->{{Hatnote|<!-- -->For {{{1}}}, see {{#var:text}}.<!-- -->}}<!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude> 1899e48855153617f7c0bf3087b781bc80f0395c Template:For/doc 10 109 131 2025-08-20T01:23:34Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Topic", "description": "The topic the following pages are about.", "example": "more information", "type": "line", "required": true }, "2": { "label": "Related Page", "description": "A related page.", "example": "Related Page", "type": "wiki-page-name", "required": true }, "3": { "label": "Second Page", "description": "A second related page.", "example": "Second Related Page", "type": "wiki-page-name" }, "4": { "label": "Third Page", "description": "A third related page.", "example": "Third Related Page", "type": "wiki-page-name" } }, "description": "This hatnote template is meant to be used to show pages related to a topic the reader might want to visit.", "paramOrder": [ "1", "2", "3", "4" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{For|more information|Special:WantedPages}}</nowiki></code> || {{For|more information|Special:WantedPages}} |- | <code><nowiki>{{For|more information|Special:WantedPages|Special:UncategorizedPages}}</nowiki></code> || {{For|more information|Special:WantedPages|Special:UncategorizedPages}} |- | <code><nowiki>{{For|more information|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}</nowiki></code> || {{For|more information|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}} |- | <code><nowiki>{{For|more information|Special:WantedPages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{For|more information|Special:WantedPages{{!}}Page 1}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:For|Wikipedia's For Template]]. <noinclude>[[Category:Template documentation]]</noinclude> b2a30a9bf8acff259d5e86654a2de69c2d5e4fff Template:Main 10 110 132 2025-08-20T01:23:34Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:text|<!-- start vd -->{{#if:{{{2|}}}<!-- if more than one page -->|[[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if -->|, [[{{{2}}}]] and [[{{{3}}}]]<!-- concat two -->|<nowiki> </nowiki>and [[{{{2}}}]]<!-- else; concat one -->}}<!-- end concat if -->|[[{{{1}}}]]<!-- else; one page only -->}}<!-- end if -->}}<!-- end vd -->{{Hatnote|<!-- -->{{#if:{{{2|}}}|Main articles|Main article}}: {{#var:text}}<!-- -->}}<!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude> e02ac04db1bbce6b71a9aa8a5064182f662d8470 Template:Main/doc 10 111 133 2025-08-20T01:23:35Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Article", "description": "A main article.", "example": "Article", "type": "wiki-page-name", "required": true }, "2": { "label": "Second Article", "description": "A second main article.", "example": "Second Article", "type": "wiki-page-name" }, "3": { "label": "Third Article", "description": "A third main article.", "example": "Third Article", "type": "wiki-page-name" } }, "description": "This hatnote template is meant to be in sections of an article mentioning information about another existing main article.", "paramOrder": [ "1", "2", "3" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Main|Special:WantedPages}}</nowiki></code> || {{Main|Special:WantedPages}} |- | <code><nowiki>{{Main|Special:WantedPages#Section Title}}</nowiki></code> || {{Main|Special:WantedPages#Section Title}} |- | <code><nowiki>{{Main|Special:WantedPages|Special:UncategorizedPages}}</nowiki></code> || {{Main|Special:WantedPages|Special:UncategorizedPages}} |- | <code><nowiki>{{Main|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}}</nowiki></code> || {{Main|Special:WantedPages|Special:UncategorizedPages|Special:UncategorizedCategories}} |- | <code><nowiki>{{Main|Special:WantedPages{{!}}Page 1}}</nowiki></code> (Custom link label) || {{Main|Special:WantedPages{{!}}Page 1}} |} == Dependencies == This template requires the {{tl|Hatnote}} metatemplate. == Source == Roughly based on [[wikipedia:Template:For|Wikipedia's For Template]]. <noinclude>[[Category:Template documentation]]</noinclude> dd762adeece0f944821cb81ee14a8bd9cb539b22 Template:Ambox/doc 10 112 134 2025-08-20T01:23:35Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{#ifeq:{{ROOTPAGENAME}}|Ambox|"Ambox" is an abbreviation for '''A'''rticle '''m'''essage '''box'''. You can use amboxes in articles to indicate something important about the current page, often in the header.| This '''message template''' is an [[Template:Ambox|article message box]], or '''ambox'''. The documentation below discusses how to use each ambox provided by the wiki. }} == Premade amboxes == === Problem notice amboxes === These amboxes are used temporarily to notify other editors and visitors about a problem with an article. These amboxes support the following parameters: * <code>|tiny=</code>: If set to <code>yes</code>, the box will have less padding and the icon will be much smaller than default. * <code>|class=</code>: Any additional CSS classes to add to the ambox container element. * <code>|date=</code>: The date the ambox was added to the page. * <code>|nocat=</code>: If set to <code>yes</code>, no category will be added to the page. Use this only when creating documentation. '''Note:''' Premade amboxes need the base {{tl|Ambox}} template to work. {| class="wikitable" ! Code !! Result |- | {{tl|Cleanup}} || {{Cleanup|nocat=yes}} |- | {{tl|Delete}} || {{Delete|nocat=yes}} |- | {{tl|Merge|Example}} || {{Merge|Template:Ambox{{!}}Example|nocat=yes}} |- | {{tl|Move|Example}} || {{Move|Template:Ambox{{!}}Example|nocat=yes}} |- | {{tl|Split|Example}}<br/>{{tl|Split|Example 1|Example 2|Example 3}} || {{Split|Template:Ambox{{!}}Example|nocat=yes}} {{Split|Template:Ambox{{!}}Example 1|Template:Ambox{{!}}Example 2|Template:Ambox{{!}}Example 3|nocat=yes}} |- | {{tl|Stub}} || {{Stub|nocat=yes}} |- |} === Informational amboxes === These amboxes are intended as permanent fixtures to a page, to notify visitors about some piece of information relevant to the page. These amboxes support the following parameters in addition to any listed: * <code>|tiny=</code>: If set to <code>yes</code>, the box will have less padding and the icon will be much smaller than default. * <code>|class=</code>: Any additional CSS classes to add to the ambox container element. {| class="wikitable" ! Code !! Additional parameters !! Result |- | {{tl|Spoiler warning}} || || {{Spoiler warning|nocat=yes}} |- | {{tl|No direct use}} || || {{No direct use|nocat=yes}} |- | {{tl|Uses Lua}} || <code><nowiki>|1=</nowiki></code>, a comma-separated list of modules used || {{Uses Lua|nocat=yes}} |} === Optional parameters === You can use optional parameters to further customize a premade ambox. The example below is using <code>tiny=yes</code> and <code>date=01/01/2021</code>. {{Cleanup|tiny=yes|date=01/01/2021|nocat=yes}} == Creating a custom ambox == You can create additional ambox templates as needed using the following parameters: <pre> {{Ambox | color = The left border color. | icon = The icon image to be displayed. | title = The optional title. | message = The explanation text displayed. | tiny = If you want the tiny version of the ambox, fill the parameter with "yes". | date = An optional date of creation for the message. | class = An optional CSS class for the ambox. }} </pre> == Dependencies == For this template to work properly, you need the following: * <code>.ambox</code> and any related classes, found in [[MediaWiki:Common.css]]. <includeonly>[[Category:Notice templates]]</includeonly><noinclude>[[Category:Template documentation]]</noinclude> d4fda481c06177d59ff39364bf17e15d7f1adfbc Template:Cleanup 10 113 135 2025-08-20T01:23:36Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = This page does not meet '''{{SITENAME}}'''<nowiki/>'s page quality standards. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to help fix grammar, formatting, or code issues. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Pages in need of improvement]]}}</includeonly><!-- --><noinclude>{{Cleanup|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 9c9fb940d733227f74a7ce12720d22f569bd4d3e Template:Delete 10 114 136 2025-08-20T01:23:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = grey | icon = Delete.svg | title = Candidate for Deletion | message = This page lacks relevance for '''{{SITENAME}}''' and is a candidate for '''deletion'''. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for deletion]]}}</includeonly><!-- --><noinclude>{{Delete|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 6c827de94518d7f5f1635b13425be0d0fb4078da Template:No direct use 10 115 137 2025-08-20T01:23:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{ambox|icon=Warning-red.svg|title=Don't call this template directly from any content page! |message=This template is intended to be used inside of another template. Then that template in turn may be used on content pages. |color=red |tiny={{{tiny|}}} |class={{{class|}}} }}</includeonly><noinclude>{{doc|Template:Ambox/doc}} [[Category:Notice templates]]</noinclude> 22c9c1b0d6c05220eb6d7ad84073f7d878b60b68 Template:UsesLua 10 116 138 2025-08-20T01:23:38Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Uses Lua]] 9675a92267565619bc6418ec4e88163985302408 Template:Cleanup/doc 10 117 139 2025-08-20T01:23:39Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Delete/doc 10 118 140 2025-08-20T01:23:40Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Spoiler warning 10 119 141 2025-08-20T01:23:40Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Ambox | color = red | icon = Warning-red.svg | title = Spoiler Warning | message = This page contains '''spoilers'''. View at your own discretion. | tiny = {{{tiny|}}} | class = {{{class|}}} }}<noinclude>{{doc|Template:Ambox/doc}}</noinclude> d46344bae30adce89ead1cf12e8c3ff904e95203 Template:Spoiler warning/doc 10 120 142 2025-08-20T01:23:41Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Uses Lua/doc 10 121 143 2025-08-20T01:23:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Stub 10 122 144 2025-08-20T01:23:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = gold | icon = Stub.svg | message = This page is a [[support:Stub|stub]]. You can help '''{{SITENAME}}''' by [{{fullurl:{{FULLPAGENAME}}|action=edit}} expanding it]. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Stubs]]}}</includeonly><!-- --><noinclude>{{Stub|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 1effeb7d6eb04a0b11c76b8bfa871703461c9344 Template:Stub/doc 10 123 145 2025-08-20T01:23:43Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Ambox/doc]] 68bfb03f8f28c95443c7b1997f252c236bf87256 Template:NoDirectUse 10 124 146 2025-08-20T01:23:43Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:No direct use]] 8448af1f61f0d64a84806b006c70670d9296acde Template:No direct use/doc 10 125 147 2025-08-20T01:23:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Ambox/doc]] 68bfb03f8f28c95443c7b1997f252c236bf87256 Template:Merge 10 126 148 2025-08-20T01:23:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = purple | icon = Merge.svg | message = It has been proposed that this page be [[support:Merge|merged]] with [[{{{1}}}]]. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for merging]]}}</includeonly><!-- --><noinclude>{{Merge|Template:Merge|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 9975c110e793cc1943eac9ea8e62257d704ab853 Template:Merge/doc 10 127 149 2025-08-20T01:23:45Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Move 10 128 150 2025-08-20T01:23:46Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = darkorange | icon = Move.svg | message = It has been proposed that this page be moved to [[{{{1}}}]]. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for moving]]}}</includeonly><!-- --><noinclude>{{Move|Template:Ambox{{!}}Example|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> dc4fd9090208e453457d6d2df193b9a7ee3b562d Template:Move/doc 10 129 151 2025-08-20T01:23:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Split 10 130 152 2025-08-20T01:23:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:pages|<!-- start vd -->{{#if:{{{2|}}}<!-- if more than one page -->|new pages titled [[{{{1}}}]]{{#if:{{{3|}}}<!-- start concat if -->|, [[{{{2}}}]] and [[{{{3}}}]]<!-- concat two -->|<nowiki> </nowiki>and [[{{{2}}}]]<!-- else; concat one -->}}<!-- end concat if -->|a new page titled [[{{{1}}}]]<!-- else; one page only -->}}<!-- end if -->}}<!-- end vd -->{{Ambox | color = purple | icon = Split.svg | message = It has been proposed that this page be split into {{#var:pages}}. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{#ifeq: {{lc:{{{nocat|}}}}} | yes ||[[Category:Candidates for splitting]]}}</includeonly><!-- --><noinclude>{{Split|Template:Ambox{{!}}Example|nocat=yes}} {{Split|Template:Ambox{{!}}Example 1|Template:Ambox{{!}}Example 2|Template:Ambox{{!}}Example 3|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 73f5044c8b972e18c3b7880f94b0644e4a0e6ac7 Template:Split/doc 10 131 153 2025-08-20T01:23:48Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Ambox/doc]] 286a3914c1d2770ff27394ac3d3f36a685542cb8 Template:Anchor 10 132 154 2025-08-20T01:23:48Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><span id="{{{1}}}"></span><!-- --></includeonly><!-- --><noinclude>{{doc}} [[Category:Navigation templates]]</noinclude> 08ccba46722925866447768d344bf540b0b55e79 Template:Anchor/doc 10 133 155 2025-08-20T01:23:49Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki == Summary == This template can be used to insert an invisible anchor (reference points) into a page that can later be used by internal wiki links. == Usage == To create a custom anchor, use <code><nowiki>{{Anchor|Anchor Name}}</nowiki></code> anywhere in the page. For example, if you create the anchor <code><nowiki>{{Anchor|Example Anchor}}</nowiki></code> in the page <code><nowiki>[[Example]]</nowiki></code>, you can access it through the internal link <code><nowiki>[[Example#Example Anchor]]</nowiki></code>. Remember that you can create a [[support:Redirect|redirect]] to this template so that you can call it more easily, such as with <code><nowiki>{{a|Anchor Name}}</nowiki></code>. <noinclude>[[Category:Template documentation]]</noinclude> 4b0ddb50416a354db262e62617d9b45056f4d526 Template:Key/doc/Xbox 10 134 156 2025-08-20T01:23:50Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Images source: [[dev:Category:Xbox input images]] === Series & One === <code><nowiki>{{Key|Xbox|A}}</nowiki></code> {{Key|Xbox|A}} <code><nowiki>{{Key|Xbox|B}}</nowiki></code> {{Key|Xbox|B}} <code><nowiki>{{Key|Xbox|X}}</nowiki></code> {{Key|Xbox|X}} <code><nowiki>{{Key|Xbox|Y}}</nowiki></code> {{Key|Xbox|y}} <code><nowiki>{{Key|Xbox|Left Thumbstick}}</nowiki></code> {{Key|Xbox|Left Thumbstick}} <code><nowiki>{{Key|Xbox|Right Thumbstick}}</nowiki></code> {{Key|Xbox|Right Thumbstick}} <code><nowiki>{{Key|Xbox|Left Thumbstick Press}}</nowiki></code> {{Key|Xbox|Left Thumbstick Press}} <code><nowiki>{{Key|Xbox|Right Thumbstick Press}}</nowiki></code> {{Key|Xbox|Right Thumbstick Press}} <code><nowiki>{{Key|Xbox|LB}}</nowiki></code> {{Key|Xbox|LB}} <code><nowiki>{{Key|Xbox|RB}}</nowiki></code> {{Key|Xbox|RB}} <code><nowiki>{{Key|Xbox|View}}</nowiki></code> {{Key|Xbox|View}} <code><nowiki>{{Key|Xbox|Menu}}</nowiki></code> {{Key|Xbox|Menu}} <code><nowiki>{{Key|Xbox|Button}}</nowiki></code> {{Key|Xbox|Button}} === Xbox Series === <code><nowiki>{{Key|Xbox|D-pad}}</nowiki></code> {{Key|Xbox|D-pad}} <code><nowiki>{{Key|Xbox|D-pad Left}}</nowiki></code> {{Key|Xbox|D-pad Left}} <code><nowiki>{{Key|Xbox|D-pad Right}}</nowiki></code> {{Key|Xbox|D-pad Right}} <code><nowiki>{{Key|Xbox|D-pad Up}}</nowiki></code> {{Key|Xbox|D-pad Up}} <code><nowiki>{{Key|Xbox|D-pad Down}}</nowiki></code> {{Key|Xbox|D-pad Down}} <code><nowiki>{{Key|Xbox|LT}}</nowiki></code> {{Key|Xbox|LT}} <code><nowiki>{{Key|Xbox|RT}}</nowiki></code> {{Key|Xbox|RT}} <code><nowiki>{{Key|Xbox|Share}}</nowiki></code> {{Key|Xbox|Share}} ==== Diagram ==== <code><nowiki>{{Key|Xbox|Series Controller Diagram}}</nowiki></code> {{Key|Xbox|Series Controller Diagram}} === Xbox One === <code><nowiki>{{Key|Xbox|One D-pad}}</nowiki></code> {{Key|Xbox|D-pad}} <code><nowiki>{{Key|Xbox|One D-pad Left}}</nowiki></code> {{Key|Xbox|D-pad Left}} <code><nowiki>{{Key|Xbox|One D-pad Right}}</nowiki></code> {{Key|Xbox|D-pad Right}} <code><nowiki>{{Key|Xbox|One D-pad Up}}</nowiki></code> {{Key|Xbox|D-pad Up}} <code><nowiki>{{Key|Xbox|One D-pad Down}}</nowiki></code> {{Key|Xbox|D-pad Down}} <code><nowiki>{{Key|Xbox|One Left Trigger}}</nowiki></code> {{Key|Xbox|One Left Trigger}} <code><nowiki>{{Key|Xbox|One Right Trigger}}</nowiki></code> {{Key|Xbox|One Right Trigger}} ==== Diagram ==== <code><nowiki>{{Key|Xbox|One Controller Diagram}}</nowiki></code> {{Key|Xbox|One Controller Diagram}} __NOTOC__ <noinclude>[[Category:Key template documentation]]</noinclude> adce81e2e9eafcf930052a8993d3e5625665202e Template:Key/doc/DualSense 10 135 157 2025-08-20T01:23:50Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Images source: [[dev:Category:DualSense input images]] === Buttons === <code><nowiki>{{Key|PS|Directional}}</nowiki></code> {{Key|PS|Directional}} <code><nowiki>{{Key|PS|Directional Left}}</nowiki></code> {{Key|PS|Directional Left}} <code><nowiki>{{Key|PS|Directional Right}}</nowiki></code> {{Key|PS|Directional Right}} <code><nowiki>{{Key|PS|Directional Up}}</nowiki></code> {{Key|PS|Directional Up}} <code><nowiki>{{Key|PS|Directional Down}}</nowiki></code> {{Key|PS|Directional Down}} <code><nowiki>{{Key|PS|Left Stick}}</nowiki></code> {{Key|PS|Left Stick}} <code><nowiki>{{Key|PS|Right Stick}}</nowiki></code> {{Key|PS|Right Stick}} <code><nowiki>{{Key|PS|Touch Pad}}</nowiki></code> {{Key|PS|Touch Pad}} <code><nowiki>{{Key|PS|Circle}}</nowiki></code> {{Key|PS|Circle}} <code><nowiki>{{Key|PS|Cross}}</nowiki></code> {{Key|PS|Cross}} <code><nowiki>{{Key|PS|Square}}</nowiki></code> {{Key|PS|Square}} <code><nowiki>{{Key|PS|Triangle}}</nowiki></code> {{Key|PS|Triangle}} <code><nowiki>{{Key|PS|Create}}</nowiki></code> {{Key|PS|Create}} <code><nowiki>{{Key|PS|Options}}</nowiki></code> {{Key|PS|Options}} <code><nowiki>{{Key|PS|L1}}</nowiki></code> {{Key|PS|L1}} <code><nowiki>{{Key|PS|R1}}</nowiki></code> {{Key|PS|R1}} <code><nowiki>{{Key|PS|L2}}</nowiki></code> {{Key|PS|L2}} <code><nowiki>{{Key|PS|R2}}</nowiki></code> {{Key|PS|R2}} <code><nowiki>{{Key|PS|L3}}</nowiki></code> {{Key|PS|L3}} <code><nowiki>{{Key|PS|R3}}</nowiki></code> {{Key|PS|R3}} <code><nowiki>{{Key|PS|Mute}}</nowiki></code> {{Key|PS|Mute}} <code><nowiki>{{Key|PS|PS}}</nowiki></code> {{Key|PS|PS}} === Diagram === <code><nowiki>{{Key|PS|Controller Diagram}}</nowiki></code> {{Key|PS|Controller Diagram}} <noinclude>[[Category:Key template documentation]]</noinclude> 84fa5123f9494d3572fef65e1aa63dd95ef476be Template:Gad 10 136 158 2025-08-20T01:23:51Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <code>Gadget-[[MediaWiki:Gadget-{{{1}}}|{{{1}}}]]</code><noinclude>[[Category:Formatting templates]]</noinclude> dd027468a6022472506b1fc2973d6299ec01e854 Template:From Wikipedia 10 137 159 2025-08-20T01:23:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{Ambox | color = darkblue | icon = Wikipedia.svg | title= This code is adapted from [[wikipedia:Main Page|Wikipedia]]. | message = For the original code, see the following pages: {{#arraymap:{{{1|}}}|,|%s|[[wikipedia:%s|%s]]}} | tiny = {{{tiny|}}} | class = {{{class|}}} }}</includeonly><noinclude>{{doc}}</noinclude> 0bb256ef5acc38fb0cfbdacc22e75aab89bd6e2c Template:!-! 10 138 160 2025-08-20T01:23:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki |-|<noinclude>{{documentation}}</noinclude> c634369c1e88b95ebe6a6d827cb32dc1e9c61fec Template:!-!/doc 10 139 161 2025-08-20T01:23:56Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:((/doc]] 509bb731d447456a18489848c8a1ce38feddabcc Template:Color 10 140 162 2025-08-20T01:23:56Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><span class="color">{{{1}}}&nbsp;<span class="color__splotch" style="background-color: {{{1}}};" title="{{{1}}}"></span></span>[[Category:Pages with colors]]</includeonly><noinclude> {{doc}} [[Category:Formatting templates]] </noinclude> 8d576236ad82770d3c04720d4ac105edcb835874 Template:Color/doc 10 141 163 2025-08-20T01:23:57Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template creates a small color splotch with a given background color next to a plaintext color code. This is useful for previewing colors. ==Usage== {{tlx|color|<color>}} Where <code><color></code> is any valid [https://developer.mozilla.org/en-US/docs/Web/CSS/color_value CSS color]. ==Examples== <pre> My favorite color is {{color|darkgreen}} I think the current {{color|#6d8afb}} of links should be changed to a {{color|#6df4fb}} RGB is cool too, you can do {{color|rgb(128,255,128)}}, or even transparency with {{color|rgba(128,255,128,0.5)}}. </pre> Produces: My favorite color is {{color|darkgreen}} I think the current {{color|#6d8afb}} of links should be changed to a {{color|#6df4fb}} RGB is cool too, you can do {{color|rgb(128,255,128)}}, or even transparency with {{color|rgba(128,255,128,0.5)}}. <noinclude>[[Category:Template documentation]]</noinclude> cb66b177cf785e1b3f60e28e36852b253e4b3d82 Template:Example character infobox 10 142 164 2025-08-20T01:23:57Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main <!-- See https://support.wiki.gg/wiki/DRUID_infoboxes for extra documentation --> <!-- the "kind" categorizes this type of infobox. For example, you might want to write `Character`, `Level`, or `Item`. --> <!-- This `kind` value should be unique to this template, and no other infobox template should have the same value --> |kind=example-1 <!-- You can almost certainly leave the separator alone, unless one of your *section names* has a comma in it --> |sep=, <!-- feel free to edit the 300px but mostly try to avoid changing this next line unless you are adding tabs --> |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} <!-- every infobox needs a |sections= parameter, which lists the groups of sections, in order top to bottom --> |sections=General Info, Stats <!-- for each section, specify the list of fields that you want to show up in that section, top to bottom --> <!-- empty fields (not specified on the content page) will not show up --> |General Info=Region,Element |Stats=Attack, HP, Armor, Attack Speed <!-- this field formats the `Attack Speed` parameter when it's specified by the content page, adding a % sign to the end of it. --> <!-- this is an optional operation to do, only do it if you need to provide some extra formatting --> |Attack Speed={{#if:{{{Attack Speed|}}}|{{{Attack Speed}}}%}} }}<!-- Here is the above code without comments for easier copy-pasting: {{#invoke:Infobox|main |kind=example-1 |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=General Info, Stats |General Info=Region,Element |Stats=Attack, HP, Armor, Attack Speed |Attack Speed={{#if:{{{Attack Speed|}}}|{{{Attack Speed}}}%}} }} --></includeonly><noinclude> {{documentation}} [[Category:Infobox templates]]</noinclude> f49d0f82d5a212306ff66b8fee112ecf88123576 Template:Example character infobox/doc 10 143 165 2025-08-20T01:23:58Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <noinclude>Are you trying to edit [[Template:Example character infobox]]? If so, you may be in the wrong place - this is the '''documentation page''', not the template itself. To edit the template, please go here: {{fullurl:Template:Example character infobox|action=edit}} </noinclude>This is an example character infobox using the [[support:DRUID infoboxes|DRUID infoboxes]] framework. You can edit it, rename it, or delete it as desired. == Modify this template == To see how DRUID works, please '''edit this page'''! It has several comments explaining the different parts of how to make an infobox. == Copyable code for use on other content pages == If you want to create pages using this infobox, you can use the snippet below. Please understand, this code is for CONTENT PAGES ONLY!! It does not have anything to do with changing what the template supports. <syntaxhighlight lang="wikitext" style="overflow: auto;"> {{Example character infobox |title= |image= |Region= |Element= |Attack= |HP= |Armor= |Attack Speed= }} </syntaxhighlight><noinclude>[[Category:Template documentation]]</noinclude> cc625bd426cde7dbdfa16b8330ff21cd1ef2e942 Template:License/indie.io 10 144 166 2025-08-20T01:23:58Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = developer | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = This file is owned by [https://indie.io indie.io] and/or its licensors, and is licensed under the [https://indie.io indie.io] [https://www.indie.io/terms-of-service Terms of Use].<br/> All trademarks and registered trademarks present in the file are proprietary to [https://indie.io indie.io] and/or its licensors. }}</includeonly><noinclude> This template currently looks like: {{License/indie.io}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 49823bdf8d378ff755fa7b6493afde40f6a4e19a 167 166 2025-08-20T01:23:59Z ARTIFICER 564804 Protected "[[Template:License/indie.io]]" ([Edit=Allow only wiki.gg staff] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = developer | darkIcon = yes | icon = [[File:IN COPYRIGHT.svg|50px|link=https://rightsstatements.org/page/InC/1.0/?language=en|IN COPYRIGHT]] | text = This file is owned by [https://indie.io indie.io] and/or its licensors, and is licensed under the [https://indie.io indie.io] [https://www.indie.io/terms-of-service Terms of Use].<br/> All trademarks and registered trademarks present in the file are proprietary to [https://indie.io indie.io] and/or its licensors. }}</includeonly><noinclude> This template currently looks like: {{License/indie.io}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 49823bdf8d378ff755fa7b6493afde40f6a4e19a Template:- 10 145 168 2025-08-20T01:23:59Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:Clear]] 1a2aa4a9ba7478e54a2b21cbce68887ea297ea86 Template:Clear/doc 10 146 169 2025-08-20T01:24:00Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template allows you to [https://developer.mozilla.org/en-US/docs/Web/CSS/clear clear] the left side, the right side, or both by adding <code>&lt;div style="clear:left/right/both;"&gt;&lt;/div&gt;</code> ==Usage== {{tlx|Clear}}: Makes content wait until existing content is completed in all columns. Often used to stop text from flowing next to unrelated images. An optional <code>class</code> parameter can additionally be given for custom functionality. To clear the left, simply put {{tlx|Clear|left}}. To clear the right, put {{tlx|Clear|right}}. To clear both sides, put {{tlx|Clear}}. This template can also be called with {{tlx|-}} for short. <templatedata> { "params": { "1": { "label": "Direction", "description": "Which direction to clear", "type": "string", "default": "both", "suggestedvalues": [ "left", "right", "both" ] }, "class": { "label": "Class", "description": "A class to give to the clear", "type": "string" } }, "description": "Clears the left, right, or both.", "format": "inline" } </templatedata> <noinclude> [[Category:Template documentation]] </noinclude> 30e700cb1ba6902a86860319bd230680193d3b04 Template:Discord 10 147 170 2025-08-20T01:24:01Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#if:{{{1|{{{id|}}}}}}|<!-- -->{{#ifeq: {{lc:{{{full|}}}<!-- -->}} | yes<!-- display the full widget: -->|<div class="DiscordIntegrator" style="width: {{#or:{{{width|}}}|100%}}; height: {{#or:{{{height|}}}|300px}}" data-id="{{{1|{{{id}}}}}}" data-logged-in="{{{loggedIn}}}" data-theme="{{{theme|}}}" data-width="100%" data-height="100%"><!-- -->If you see this, your JavaScript might be disabled or DiscordIntegrator plugin isn't working. If the latter, please contact a wiki administrator.</div><!-- display only the small widget: -->|<div id="discord-compact-widget" data-id="{{{1|{{{id}}}}}}"></div><!-- -->}}<!-- case: id is not supplied -->|<strong class="error">DiscordIntegrator error: ID of the server isn't supplied.</strong> For instructions on how to find a Discord server ID, see [https://support.discord.com/hc/articles/206346498 this Discord Help Center article]<!-- -->}}</includeonly><!-- -->[[Category:Pages with Discord embeds]]<noinclude>{{Documentation}} [[Category:Templates]]</noinclude> 7d39c3a9d1b4eb8e95becaf418c16ec30cb9c077 Template:Discord/doc 10 148 171 2025-08-20T01:24:02Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template allows you to either use [[support:DiscordCompact|DiscordCompact]] or [[support:DiscordWidget|DiscordWidget]] to display information about a certain Discord server. == Usage == In order to be able to show a Discord server widget on your wiki, first go to your Discord server and do the following: * Open the <code>Server Settings</code>, then go to the <code>Engagement</code> section. * Scroll down to <code>Server Widget</code>. * Enable the widget. * Copy the <code>Server ID</code>. Then, do the following depending on the type of widget you want to use (compact or full). === Compact widget (default) === {{main|support:DiscordCompact{{!}}DiscordCompact}} The compact widget is the default one. To use it, simply add the template with the server ID either as the '''first''' parameter or as the <code>id</code> parameter: * <code><nowiki>{{Discord|serverID}}</nowiki></code> * <code><nowiki>{{Discord|id=serverID}}</nowiki></code> === Full widget === {{main|support:DiscordWidget{{!}}DiscordWidget}} To use the full version of the Discord widget, you have to specify <code>full=yes</code> as one of the template parameters, with the ID either as the '''first''' parameter or as the <code>id</code> parameter: * <code><nowiki>{{Discord|serverID|full=yes}}</nowiki></code> * <code><nowiki>{{Discord|full=yes|id=serverID}}</nowiki></code> You can further customize the widget with the <code>width</code>, <code>height</code> and other parameters. See the Examples section and the full documentation for DiscordWidget on the [[support:DiscordWidget|Support Wiki]]. == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Discord|951501892553424917}}</nowiki></code><br/><code><nowiki>{{Discord|id=951501892553424917}}</nowiki></code> || {{Discord|951501892553424917}} |- | <code><nowiki>{{Discord|951501892553424917}|full=yes}</nowiki></code> || {{Discord|951501892553424917|full=yes}} |- | <pre><nowiki>{{Discord|full=yes |id = 951501892553424917 |width = 300px |height = 500px }}</nowiki></pre> || {{Discord|full=yes|id=951501892553424917|width=300px|height=500px}} |} == Dependencies == * As stated before, both Compact and Widget require the given Discord server to have Widgets enabled in its Server Settings. * Both Compact and Widget require the <code>discordTemplate</code> gadget: ** [[MediaWiki:Gadgets/discordTemplate]] ** [[MediaWiki:Gadgets/discordTemplate/main.js]] == TemplateData == <templatedata> { "params": { "1": { "aliases": [ "id" ], "label": "Server ID", "description": "The Discord server's ID.", "example": "951501892553424917", "type": "line", "required": true }, "full": { "label": "Use full widget", "example": "yes", "type": "boolean", "description": "Do you want to use the full widget?" }, "width": { "label": "Width (full widget only)", "description": "A custom width for the full widget.", "example": "300px", "type": "line" }, "height": { "label": "Height (full widget only)", "description": "A custom height for the full widget.", "example": "500px", "type": "line" } }, "description": "This template allows you to either use DiscordCompact or DiscordWidget to display information about a certain Discord server.", "paramOrder": [ "1", "full", "width", "height" ], "format": "block" } </templatedata> 2b1165b9383a06a5766054d0d38b8b045cf83b25 Template:Main page box/end 10 149 172 2025-08-20T01:24:02Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly></div> </div></includeonly><noinclude> {{doc}} [[Category:Main page templates]] </noinclude> 506617faba565eb65144b21c3ead8fe5c2010b55 Template:Main page box/start 10 150 173 2025-08-20T01:24:03Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><div class="mp-box <!-- These variables are used to determine if certain layouts should hide certain boxes. The variable is created in and passed from [[Module:Main page]], and is formatted as a pseudo bitmask to reduce variable usage An example of this variable would be "1,1,0," which would mean display on desktop and tablet but not on mobile -->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|0}}|0|mp-hide-on-desktop}} <!-- -->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|1}}|0|mp-hide-on-tablet}} <!-- -->{{#ifeq:{{#explode:{{#var:imp-variable-display-box}}|,|2}}|0|mp-hide-on-mobile}} <!-- -->{{{class|}}}" style="grid-area:{{#var:imp-variable-id}}; {{{style|}}}" id="mp-box-{{#var:imp-variable-id}}" data-box-id="{{#var:imp-variable-id}}"><!-- -->{{#if:{{{title|{{{1|}}}}}}| <h2> {{{title|{{{1|}}}}}} </h2> }}<div class="mp-body"></includeonly><noinclude> {{doc}} [[Category:Main page templates]] </noinclude> 62eedb503b63a36fc31a301f8ea6b15f6ff9bf60 Template:Main page box/preload 10 151 174 2025-08-20T01:24:04Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = $1 }} Content goes here, between the start and end templates. Feel free to use wikitext, tables, templates, new lines, whatever. {{Main page box/end}}<includeonly><no<noinclude></noinclude>include>[[Category:Main page boxes]]</no<noinclude></noinclude>include></includeonly><!-- don't edit this line --><noinclude> [[Category:Main page templates]] </noinclude> 9b16288e15e3c8c9ede76b4dc76e538d2253cf23 Template:Main page 10 152 175 2025-08-20T01:24:04Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#invoke:Main page|main}} __NOTOC__ __NOEDITSECTION__ [[Category:{{SITENAME}}| ]]</includeonly><noinclude> {{doc}} [[Category:Main page templates]] </noinclude> 64a0dbb502a75c44e4b3f474772d8502bdf44e40 Template:Main page box/create 10 153 176 2025-08-20T01:24:05Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{#tag: inputbox | type = create width = 40 default = {{{1|}}} buttonlabel = Create this box prefix = {{#or:{{{rootpage|}}}|{{MediaWiki:Mainpage}}}}/ placeholder = box name (no spaces) preload = Template:Main page box/preload summary = Created using preload preloadparams[] = {{ucfirst:{{{1|Example}}}}} }}<noinclude>[[Category:Main page templates]]</noinclude> da58eca98a44a09e476c5b4a5cafde116b6cdac9 Template:Main page box 10 154 177 2025-08-20T01:24:05Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><code>Template:Main page box</code> is not intended to be used directly, please use [[Template:Main page box/start]] and [[Template:Main page box/end]].</includeonly><noinclude> This template is used to create the boxes of the IMProved Main Page (IMP) framework. '''It should not be called directly''', instead using {{tl|Main page box/start}} and {{tl|Main page box/end}}. <div style="text-align:center;"> Use the box below to create a page with the required templates already in place, ready for you to add your content. {{/create}} The box name can not contain spaces or start with a number. Those are probably the only restrictions you'll run into, but for a full list see [https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident <custom-ident> on MDN web docs]. </div> ==Parameters== These are the parameters used by {{tl|Main page box/start}}. All parameters are optional. {| class="wikitable" ! Name !! Data type !! Description |- | title || Wikitext || The title of the box. This can be empty, in which case the box will contain only the content. |- | class || CSS classes || A list of classes to be passed to the box, separated by spaces and without quotes. Standard options are <code>centered-content</code> to vertically center contents, and <code>has-floating-image</code> in case floating images are needed in the box (normally the flex layout disallows this). |- | style || CSS declarations || Inline CSS to be applied directly to the box, without quotes. A common usage is <code>text-align:center;</code> for cases where it's desired for individual boxes to have centered text. |} [[Category:Main page templates]] [[Category:Template documentation]] </noinclude> cbbd25d1eb0105a8be55d0cc174f385fc467ffad Template:Main page box/start/doc 10 155 178 2025-08-20T01:24:06Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki See [[Template:Main page box]] for information on how to use this. ==TemplateData== <templatedata> { "params": { "class": { "label": "Class", "description": "Additional classes to give to the box wrapping this box.", "example": "centered-content", "suggestedvalues": [ "centered-content", "has-floating-image" ] }, "style": { "label": "Style", "description": "Inline CSS to add to the box wrapping this box", "example": "text-align:center;", "type": "string" }, "title": { "aliases": [ "1" ], "label": "Title", "description": "The title of this box.", "example": "Welcome to the wiki!", "type": "content", "suggested": true } }, "description": "Creates a box for use on the main page.", "paramOrder": [ "title", "class", "style" ], "format": "block" } </templatedata> <noinclude>[[Category:Template documentation]]</noinclude> 860e1be8fbf205ab2b3214cb91860a77fd3ef52b Template:Main page box/end/doc 10 156 179 2025-08-20T01:24:07Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki See [[Template:Main page box]] for information on how to use this. <noinclude>[[Category:Template documentation]]</noinclude> e73182bed655118b10da971b634dc9c3bf3e3d39 Template:Main page/doc 10 157 180 2025-08-20T01:24:07Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template is used to create an IMP Main Page. It uses [[Module:Main page]] to arrange a series of [[Template:Main page box]]es in a [https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout CSS grid]. ==Simple explanation== The layout is made using keywords arranged in a grid. This grid has 3 columns on desktop-width screens, 2 columns on tablet, and 1 on mobile. Each can have as many rows as you want. Each keyword represents the same section and can span multiple rows and/or columns, but ''must'' form a contiguous rectangle of any dimension (1x1, 1x2, 2x2, 2x3, etc.). For example, the following input to desktop: <pre style="display:table;"> welcome welcome welcome about links links about contribute contribute </pre> would produce a grid resembling the following: {| class="wikitable" | style="background-color:rgba(0,255,0,0.15)" | welcome | style="background-color:rgba(0,255,0,0.15)" | welcome | style="background-color:rgba(0,255,0,0.15)" | welcome |- | style="background-color:rgba(255,0,255, 0.15)" | about | style="background-color:rgba(0,0,255, 0.15)" | links | style="background-color:rgba(0,0,255, 0.15)" | links |- | style="background-color:rgba(255,0,255, 0.15)" | about | style="background-color:rgba(255,255,0, 0.15)" | contribute | style="background-color:rgba(255,255,0, 0.15)" | contribute |} Where <code>welcome</code> is the contents of [[{{MediaWiki:Mainpage}}/welcome]], <code>about</code> is the contents of [[{{MediaWiki:Mainpage}}/about]], and so on. See [[Template:Main page box]] for more information about creating your own boxes. If you enter a keyword that does not have a corresponding box already, you'll be prompted to create one when saving or previewing the page. If you leave a keyword out of a certain layout, it will not be displayed on that layout. A warning will be given at the top of the edit preview in case this was an accident, but can be safely ignored if intentional. For additional hints and information, see the comments that came on your main page or ask a wiki.gg staff member for help. ==Technical explanation== For the CSS savvy, this section explains how it works a bit under the hood. The input to desktop, tablet, and mobile create [https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties CSS variables] which are then used as the value of [https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas grid-template-areas] in media queries for screen widths >=1350px, >=990px, and <990px. The boxes are given an id based on their subpage name, which is then used by the module to find the template, as well as by the box templates to assign them a CSS id of <code>mp-box-<keyword></code>. Since these keywords are used directly in the grid layout, they must follow the rules of [https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident <custom-ident>] naming. ==Dependencies== For this template to work properly, you need the following: * [[Module:Main page]] * All templates in [[:Category:Main page templates]]. * All CSS within the "Main page layout" section found in [[MediaWiki:Common.css]]. The <code>[[MediaWiki:Gadgets/mpEditLinks|mpEditLinks]]</code> gadget is also highly recommended. Its code can be found at [[MediaWiki:Gadgets/mpEditLinks/main.css]] and [[MediaWiki:Gadgets/mpEditLinks/main.js]]. ==TemplateData== <templatedata> { "params": { "desktop": { "label": "Desktop", "description": "The layout for wide screens", "required": true, "type": "string" }, "tablet": { "label": "Tablet", "description": "The layout for mid-width screens", "required": true, "type": "string" }, "mobile": { "label": "Mobile", "description": "The layout for narrow screens", "required": true, "type": "string" } }, "description": "Creates an IMP Main Page.", "format": "block" } </templatedata> <noinclude>[[Category:Template documentation]]</noinclude> c5052ca4c6f9f0e1e2c0a81cea00e372d4bacdca Template:Ct 10 158 181 2025-08-20T01:24:08Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <code><nowiki>[</nowiki>[[Special:CargoTables/{{{1}}}|{{{1}}}]]<nowiki>]</nowiki>{{#if:{{{2|}}}|.{{{2}}}}}</code><noinclude> [[Category:Formatting templates]]</noinclude> d868545d4d3eeb1545e963d063199a68abba7836 Template:Main page box/missing 10 159 182 2025-08-20T01:24:08Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{Main page box/start | title = {{{1}}} | style = text-align:center; | class = missing }} The {{{1}}} box does not exist. Check your spelling or create it here:<br/> {{Main page box/create|{{{1|}}}|rootpage = {{{rootpage|}}}}}<br/> See [[Template:Main page box]] for more information. {{Main page box/end}}<noinclude>[[Category:Main page templates]]</noinclude> 5cff88dacf33c912d4aa04c1541e684a5f3e79bb Template:Iter 10 160 183 2025-08-20T01:24:09Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{#vardefine:varname|ITER_INDEX_{{#if:{{{1|}}}|{{{1}}}|default}}<!-- end vardefine -->}}<!-- main logic -->{{#vardefineecho:{{#var:varname}}| {{#expr: {{#ifeq:{{lc:{{{reset|}}}<!-- end lc -->}} |yes |0 |{{#var:{{#var:varname}}|0}} <!-- end ifeq -->}} + {{#if:{{{get|}}}|0|1}} <!-- end expr -->}} <!-- end vde -->}}</includeonly><noinclude>{{documentation}} [[Category:Templates]]</noinclude> c37a3625d58a115a140f129da248ec1c9f6cb55e Template:Iter/doc 10 161 184 2025-08-20T01:24:09Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template helps you create indexed columns in tables (particularly [[support:Cargo|Cargo]] queries) and to retrieve iterator values when using the parser function <code><nowiki>{{#arraymaptemplate</nowiki></code> (bundled with Extension:ParserPower on wiki.gg). == Simple counting == <pre> * {{iter|}} * {{iter|}} * {{iter|}} * {{iter|}} </pre> * {{iter|}} * {{iter|}} * {{iter|}} * {{iter|}} == Reset the counter == <pre> * {{iter|reset=yes}} * {{iter|}} * {{iter|reset=yes}} * {{iter|}} </pre> * {{iter|reset=yes}} * {{iter|}} * {{iter|reset=yes}} * {{iter|}} == Multiple counters == <pre> * {{iter|key1}} * {{iter|key2}} * {{iter|key2}} * {{iter|key1}} </pre> * {{iter|key1}} * {{iter|key2}} * {{iter|key2}} * {{iter|key1}} == Get value without incrementing == <pre> * {{iter|reset=yes}} * {{iter|}} * {{iter|}} * {{iter|get=yes}} </pre> * {{iter|reset=yes}} * {{iter|}} * {{iter|}} * {{iter|get=yes}} <noinclude> [[Category:Template documentation]] </noinclude> 20b5a53a6457493d2a2a9774b803511678a65760 Template:License/permission 10 162 185 2025-08-20T01:24:10Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = permission | icon = [[File:IN COPYRIGHT.svg|50px|link=|IN COPYRIGHT WITH PERMISSION]] | text = This file is copyrighted. The copyright holder has given permission for its use on wiki.gg. }}</includeonly><noinclude> This template currently looks like: {{License/permission}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 854af75c8477c36c50cb5d103ad8a933892fc322 186 185 2025-08-20T01:24:11Z ARTIFICER 564804 Protected "[[Template:License/permission]]" ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{License/template | source = {{{source|}}} | type = permission | icon = [[File:IN COPYRIGHT.svg|50px|link=|IN COPYRIGHT WITH PERMISSION]] | text = This file is copyrighted. The copyright holder has given permission for its use on wiki.gg. }}</includeonly><noinclude> This template currently looks like: {{License/permission}} See {{tl|License}} for full license documentation [[Category:License templates]]</noinclude> 854af75c8477c36c50cb5d103ad8a933892fc322 Template:Flag 10 163 187 2025-08-20T01:24:11Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><!-- --><span class="country-flag" title="{{{2|}}}">{{#if: {{{1|}}} | [[File:Flag {{{1|}}}.svg|x20px|link=]] | }}</span><!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Formatting templates]]</noinclude> 9802f61bee0e36120c835608ccee85e72384341b Template:Flag/doc 10 164 188 2025-08-20T01:24:12Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This formatting template allows you to display country flags inline. Available country flags can be seen in [[dev:Category:Country_flags|our Commons Wiki]]. == Usage == The template can be used with the following formatting: <code><nowiki>{{flag|code|Legend}}</nowiki></code>, where: * <code>code</code> is the [[wikipedia:ISO 3166-1 alpha-2|ISO 3166-1 alpha-2]] code for the country flag. * <code>Legend</code> is the legend displayed on hover (optional). == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{flag|ca|Canada}}</nowiki></code> || {{flag|ca|Canada}} |} <noinclude>[[Category:Template documentation]]</noinclude> 1fb455be1ffbed259dd27df18dd447e605746ed4 Template:Disambig 10 165 189 2025-08-20T01:24:12Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #redirect [[Template:Disambiguation]] f220bcb889e0ce686a839d64ec6c4359b0e8bfb7 Template:TOC limit 10 166 190 2025-08-20T01:24:13Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><div class="toclimit-{{{1|{{{limit|3}}}}}}">__TOC__</div></includeonly><noinclude> {{documentation}} [[Category:Table of contents templates]] </noinclude> 9187098528659316936c0da0589a7745f10e38e3 Template:TOC limit/doc 10 167 191 2025-08-20T01:24:14Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This template inserts a Table of Contents that omits subheadings beyond a certain depth. The table obeys the same layout rules as the <nowiki>__TOC__</nowiki> [[mw:Help:Magic_words|magic word]]. Omitted sections still have section edit links in the article body. The main use for this template is situations where you want section edit links for ease of editing but don't want a full table of contents. '''Before using this template, consider whether and why it would be helpful to readers and other editors.''' == Usage == {{tlx|TOC limit}} or {{tlx|TOC limit|3}} The template defaults to including second- and third-level headings, e.g. those numbered "1" and "1.1" in the TOC. (Note: {{tlx|TOC limit|1}} does nothing: the first-level heading on a page is, by default, the page title.) You can specify a different limit by adding a header level: {{tlx|TOC limit|4}} 4 allows for fourth-level headings, e.g. "1.1.1", but omits any subheadings below that from the TOC. The template works by hiding the lower levels with CSS. See [[Mediawiki:Common.css]]. == TOC levels versus wikitext header levels == The heading levels in the TOC normally correspond to the header levels in the wikitext, so a <code>== Level-2 header ==</code> will normally generate the first-level ("1") TOC headings, a <code>=== Level-3 header ===</code> will normally generate the second-level ("1.1") TOC headings, and so on. This correspondence does ''not'' hold if the page contains <code>= Level-1 headers =</code> or skips header levels. For example, wikitext like this: <pre> == Level-2 heading (A) == === Level-3 heading (B) === == Level-2 heading (C) == ====== Level-6 heading (D) ====== = Level-1 heading (E) = == Level-2 heading (F) == === Level-3 heading (G) === </pre> will generate a TOC like this: {| class="toc" |<div style="text-align:center"><b>Contents</b></div> <ul> <li class="toclevel-1 tocsection-1"><span class="tocnumber">1</span> <span class="toctext">Level-2 heading (A)</span><ul> <li class="toclevel-2 tocsection-2"><span class="tocnumber">1.1</span> <span class="toctext">Level-3 heading (B)</span></li> </ul></li> <li class="toclevel-1 tocsection-1"><span class="tocnumber">2</span> <span class="toctext">Level-2 heading (C)</span><ul> <li class="toclevel-2 tocsection-2"><span class="tocnumber">2.1</span> <span class="toctext">Level-6 heading (D)</span></li> </ul></li> <li class="toclevel-1 tocsection-1"><span class="tocnumber">3</span> <span class="toctext">Level-1 heading (E)</span><ul> <li class="toclevel-2 tocsection-2"><span class="tocnumber">3.1</span> <span class="toctext">Level-2 heading (F)</span><ul> <li class="toclevel-3 tocsection-3"><span class="tocnumber">3.1.1</span> <span class="toctext">Level-3 heading (G)</span></li> </ul></li> </ul></li> </ul> |} Using <code><nowiki>{{TOC limit}}</nowiki></code> on this page ''would not'' hide header D, because even though it is a level-6 heading it is shown at the second level in the TOC. And it ''would'' hide header G even though it is a level-3 heading just like header B, because header G is shown at the third level in the TOC while header B is shown at the second level. == Conflicts == This template does not interact well with the {{tl|TOC right}} template. To achieve the correct effect, use those with a limit parameter. For example, {{tlx|TOC&nbsp;right|2=limit=2}} has the effect that {{tlx|TOC&nbsp;right}} and {{tlx|TOC&nbsp;limit|2}} would have - if they worked together. == TemplateData == <templatedata> { "params": { "1": { "aliases": [ "limit" ], "label": "Limit", "description": "Maximum header depth to be included in table of contents", "default": "3", "suggested": true, "type": "number" } }, "description": "Inserts a Table of Contents that omits subheadings beyond a certain depth." } </templatedata> <noinclude>[[Category:Template documentation]]</noinclude> 8582cad25d72e508a04a81c36ef5ecb663a32bc7 Template:TOC right 10 168 192 2025-08-20T01:24:14Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly><div class="tocright {{#if:{{{limit|}}}|toclimit-{{{limit}}}}}">__TOC__</div></includeonly><noinclude> {{documentation}} [[Category:Table of contents templates]] </noinclude> 8b94caa5343acd906cad9e74465f0ea5ce4e9549 Template:TOC right/doc 10 169 193 2025-08-20T01:24:15Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{tl|TOC right}} forces the auto-generated Table of Contents for an article to appear floated to the right side of the page in order to improve article layout. ==Usage== Insert <code><nowiki>{{TOC right}}</nowiki></code> at the point in the article where you want the top of the Table of Contents box to appear. This should usually be after the text of the lead section, and just before the first section heading. Use with {{tl|clear}} to prevent collision with text. Avoid placing the TOC in a visually poor location. Crossing a section division is probably a poor idea. ;limit : Limits the depth of subheadings shown. For instance using <code>limit=4</code> will hide the fourth level and deeper subheadings in the hierarchy. And <code>limit=2</code> will hide all subheadings leaving only the main headings. This works by hiding the lower levels with CSS. See {{tl|TOC limit}} for more information on this. Do not place this template so that the TOC aligns with a large image or infobox; this breaks the layout on narrow screens (even users with screens as wide as 1024px wide can have problems). Also, a TOC that crosses a section division is probably a poor idea, if that can be avoided. Unless the section in which the {{tl|TOC right}} is placed is long enough, the result may well be undesirable. It should only be used in cases where the TOC gets in the way of other content or is detrimental to the layout of the page; it should ''not'' simply be used for aesthetics since it tampers with the standard appearance of articles. ==TemplateData== <templatedata> { "params": { "limit": { "label": "Limit", "description": "Limits the depth of subheadings shown. For instance using limit=4 will hide the fourth level and deeper subheadings in the hierarchy. And limit=2 will hide all subheadings leaving only the main headings. This works by hiding the lower levels with CSS", "type": "number" } }, "description": "{{TOC right}} forces the auto-generated \"Table of Contents\" for an article to appear floated to the right side of the page (as seen right), in order to improve article layout.", "paramOrder": [ "limit" ], "format": "inline" } </templatedata> <noinclude>[[Category:Template documentation]]</noinclude> 88415e28677a029fbca8963e109305c2d2d79643 Template:Toc limit 10 170 194 2025-08-20T01:24:16Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:TOC limit]] cfa656c80245fbc1966e109758445db069c69934 Template:Toclimit 10 171 195 2025-08-20T01:24:16Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:TOC limit]] cfa656c80245fbc1966e109758445db069c69934 Template:Toc right 10 172 196 2025-08-20T01:24:17Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:TOC right]] fc00258b0a19738ebc9c13dbcc88881f9d5bff3e Template:Tocright 10 173 197 2025-08-20T01:24:18Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki #REDIRECT [[Template:TOC right]] fc00258b0a19738ebc9c13dbcc88881f9d5bff3e Category:Documentation templates 14 174 198 2025-08-20T01:24:19Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Templates 14 175 199 2025-08-20T01:24:20Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:{{SITENAME}}]] dd8aaa34cf600c1567d240a3f4bc615164a11592 Category:Bleak Faith: Forsaken Wiki 14 176 200 2025-08-20T01:24:20Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This is the top-level category. It contains meta categories and pages about the wiki. 8935f2b3e97edfeadd7bb206f1e17c03099ec24a Category:Notice templates 14 177 201 2025-08-20T01:24:21Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Formatting templates 14 178 202 2025-08-20T01:24:21Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:License templates 14 179 203 2025-08-20T01:24:22Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Pages using DynamicPageList3 parser function 14 180 204 2025-08-20T01:24:22Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Candidates for deletion 14 181 205 2025-08-20T01:24:23Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Hidden categories 14 182 206 2025-08-20T01:24:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki These categories are hidden on article pages. [[Category:Wiki maintenance]] e4d17499a8377d3f2b4b4a618a671e53111f43ca Category:Images 14 183 207 2025-08-20T01:24:24Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Media]] b141d2b9971d6efe9f59bd03449781e71411c631 Category:Infobox templates 14 184 208 2025-08-20T01:24:25Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Logos 14 185 209 2025-08-20T01:24:25Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Images]] 8820b63e35aedd9d2666fe40b965d4e91ce0a106 Category:Media 14 186 210 2025-08-20T01:24:26Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:{{SITENAME}}]] dd8aaa34cf600c1567d240a3f4bc615164a11592 Category:Pages containing omitted template arguments 14 187 211 2025-08-20T01:24:26Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages using TabberTransclude parser tag 14 188 212 2025-08-20T01:24:27Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Pages using Tabber parser tag 14 189 213 2025-08-20T01:24:28Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Pages using duplicate arguments in template calls 14 190 214 2025-08-20T01:24:28Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages where expansion depth is exceeded 14 191 215 2025-08-20T01:24:29Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages where template include size is exceeded 14 192 216 2025-08-20T01:24:29Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages where the unstrip depth limit is exceeded 14 193 217 2025-08-20T01:24:30Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages where the unstrip size limit is exceeded 14 194 218 2025-08-20T01:24:30Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with broken file links 14 195 219 2025-08-20T01:24:31Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Wiki maintenance]] 197b5fc8ebad5537759adacc0079b4b2662cb4c4 Category:Pages with ignored display titles 14 196 220 2025-08-20T01:24:31Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with math errors 14 197 221 2025-08-20T01:24:32Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with non-numeric formatnum arguments 14 198 222 2025-08-20T01:24:32Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with reference errors 14 199 223 2025-08-20T01:24:33Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with script errors 14 200 224 2025-08-20T01:24:34Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with syntax highlighting errors 14 201 225 2025-08-20T01:24:34Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with template loops 14 202 226 2025-08-20T01:24:35Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with too many expensive parser function calls 14 203 227 2025-08-20T01:24:35Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Promotional images 14 204 228 2025-08-20T01:24:36Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki Official images used for purposes of promoting the game, that may not actually represent gameplay. [[Category:Images]] 80b893c439747ce681cf18cc579c3bc4c65cd502 Category:Stubs 14 205 229 2025-08-20T01:24:36Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Template documentation 14 206 230 2025-08-20T01:24:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] [[Category:Wiki maintenance]] c1800be0da4588b3b652fa5324aade2c496fb3c5 Category:Templates with no documentation 14 207 231 2025-08-20T01:24:37Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Templates]] [[Category:Wiki maintenance]] b1ff76c0593194e53e6bf42f37ca337a5493c57e Category:Wiki maintenance 14 208 232 2025-08-20T01:24:38Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki The sub-categories of this category contain pages that have been identified as needing attention for one or more of the following reasons: * Changes have been suggested that should be discussed first or are under discussion. * The page has flaws that need addressing by an editor with the knowledge or skills to help. * The action the page needs requires special rights. ''See also:'' * [[Special:BrokenRedirects|Broken redirects]] * [[Special:DoubleRedirects|Double redirects]] * [[Special:UncategorizedCategories|Uncategorized categories]] * [[Special:UncategorizedFiles|Uncategorized files]] * [[Special:UncategorizedPages|Uncategorized pages]] * [[Special:UncategorizedTemplates|Uncategorized templates]] * [[Special:WantedCategories|Wanted categories]] * [[Special:WantedFiles|Wanted files]] * [[Special:WantedPages|Wanted pages]] * [[Special:WantedTemplates|Wanted templates]] * [[Special:TrackingCategories|Other special tracking categories]] [[Category:{{SITENAME}}]] 4b90dc0dbd8c91e131e4ffcf22360b1c837b9717 Category:Wiki skin images 14 209 233 2025-08-20T01:24:38Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Images]] 8820b63e35aedd9d2666fe40b965d4e91ce0a106 Category:Pages using DynamicPageList3 dplvar parser function 14 210 234 2025-08-20T01:24:39Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Pages including data maps failing validation 14 211 235 2025-08-20T01:24:40Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ __HIDDENCAT__ [[Category:Wiki maintenance]] 57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97 Category:Pages including data maps 14 212 236 2025-08-20T01:24:40Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Maps failing data validation 14 213 237 2025-08-20T01:24:41Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ __HIDDENCAT__ [[Category:Wiki maintenance]] 57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97 Category:Legal notices 14 214 238 2025-08-20T01:24:41Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:{{SITENAME}}]] dd8aaa34cf600c1567d240a3f4bc615164a11592 Category:Pages setting LuaCache keys 14 215 239 2025-08-20T01:24:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ __HIDDENCAT__ [[Category:Wiki maintenance]] 57e36e9878c3eb806aa6ee6f748a5c5e0cdd5a97 Category:Hatnote templates 14 216 240 2025-08-20T01:24:42Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Key template documentation 14 217 241 2025-08-20T01:24:43Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Template documentation]] e65ecf60878d4707b3b4c1e3962615e2d5f3b2ab Category:Navigation templates 14 218 242 2025-08-20T01:24:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Pages with failing Cargo queries 14 219 243 2025-08-20T01:24:44Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with math render errors 14 220 244 2025-08-20T01:24:45Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] 786037995b8f7e89762a8ea13b84ade091453c00 Category:Pages with DRUID infoboxes 14 221 245 2025-08-20T01:24:46Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a DRUID infobox. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 17ed4520e5c453209616df3c9b2306fce8ceb12f Category:Pages with navboxes 14 222 246 2025-08-20T01:24:46Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|navbox}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 3e48f396fafee5d8aecf6cd0dcb554c769f485a9 Category:Pages with amboxes 14 223 247 2025-08-20T01:24:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with an {{tl|ambox}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] de382f794395f344d0147dbb96b9542d6f38f624 Category:Pages with hatnotes 14 224 248 2025-08-20T01:24:47Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|hatnote}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 4ac7721cfcffb2f181820164d95f3af8d86c4fd7 Category:Pages with spoilers 14 225 249 2025-08-20T01:24:48Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|spoiler}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 5822aa87e8a8897673ff589d00d2f0d622aa3be5 Category:Pages with quotes 14 226 250 2025-08-20T01:24:49Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|quote}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 2f764cddd1fb264f48b896ffd6e892df3c391e90 Category:Pages with colors 14 227 251 2025-08-20T01:24:49Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|color}}. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] bcca0312385263c30522c744df6a8c8856c68fab Category:Main page templates 14 228 252 2025-08-20T01:24:50Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Main page boxes 14 229 253 2025-08-20T01:24:51Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Main page templates]] ce086f8cfa39aeb8137ffe34e5d41aa38300cf4e Category:Pages using the RSS extension 14 230 254 2025-08-20T01:24:51Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Wiki maintenance]] d17f98d5d77b5951b7a80755914239533ad6aba6 Category:Pages with Discord embeds 14 231 255 2025-08-20T01:24:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki This category contains every page with a {{tl|Discord}} embed. It can be used for maintenance but primarily exists to enable the use of gadgets for targeted CSS and JS. __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ [[Category:Categories for loading gadgets]] 11ff5616854d8913d2c371ae3c2c610278651846 Category:Categories for loading gadgets 14 232 256 2025-08-20T01:24:52Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Wiki maintenance]] 197b5fc8ebad5537759adacc0079b4b2662cb4c4 Category:Table of contents templates 14 233 257 2025-08-20T01:24:53Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e MediaWiki:Vector.css 8 234 258 2025-08-20T01:24:54Z ARTIFICER 564804 Importing default loadout css text/css /* All CSS here will be loaded for users of the Vector skin */ /* This is the wiki.gg default loadout, please do not modify it inline. To add your own skin customizations, scroll down to the end of the default loadout (or search for "[END]" to jump there). If you modify the sheet above that point, your changes may be overwritten in updates without warning!!! If you want to maintain your own CSS for annual MediaWiki updates & be responsible for ALL bugfixes YOURSELF, change UPDATE in the following line to say NOUPDATE: DLW: UPDATE DLW VERSION: 2.2.1 IMPORTANT: if you are updating your wiki from a version before May 22, 2025, you need to copy [[MediaWiki:Gadgets/vectorScripts]] and [[MediaWiki:Gadgets/vectorScripts/main.js]] as well or your navigation tabs will break. */ /********************************************************* * Backwards compatibility with deprecated variable names * **********************************************************/ :root { --wiki-heading-color: var(--wiki-content-heading-color); --wiki-heading-font-family: var(--wiki-content-heading-font-family); --wiki-firstheading-font-family: var(--wiki-content-firstheading-font-family); } /**************************************** * End backwards compatibility variables * *****************************************/ /************************************ * Body, head, and general framework * *************************************/ :root{ --wiki-logo-box-width: calc(var(--wiki-sidebar-width, 10em) * (1 - var(--wiki-is-top-logo, 0)) + min( var(--wiki-logo-file-width, 160) / var(--wiki-logo-file-height, 160) * var(--wiki-logo-height, 160px), 100vw - var(--wiki-left-spacing, 0.5em) - var(--wiki-right-spacing, 0px) - 18px, var(--wiki-page-content-max-width, 9999px) ) * var(--wiki-is-top-logo, 0)); /* 18px: the scrollbar */ --wiki-logo-box-height: calc(var(--wiki-logo-file-height, 160) / var(--wiki-logo-file-width, 160) * var(--wiki-logo-box-width)); } html, body { height: auto; min-height: 100%; } /* site background */ html { background-color: var(--wiki-body-background-color); background-image: var(--wiki-body-background-image); /* the following have fallbacks for backwards compatibility with older versions of the loadout */ background-position: var(--wiki-body-background-position, top center); background-size: var(--wiki-body-background-size, cover); background-repeat: var(--wiki-body-background-repeat, no-repeat); background-attachment: var(--wiki-body-background-attachment, fixed); } body { background: none; font-family: var(--wiki-body-font-family); accent-color: var(--wiki-accent-color); box-sizing: border-box; padding-top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, 0px)); padding-bottom: var(--wiki-bottom-spacing, 0px); padding-left: var(--wiki-left-spacing, 0px); padding-right: var(--wiki-right-spacing, 0px); box-sizing: border-box; } .skinpref-limited-width body, body.skinpref-limited-width { --wiki-page-content-max-width: var(--wiki-content-reduced-max-width, 1300px); } /* clear fix */ body::after { content: ""; display: table; clear: both; } #mw-page-base, #mw-head-base { background: none; --height: calc(var(--wiki-navigation-height, 3em) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0) + var(--wiki-is-top-logo, 0) * (var(--wiki-logo-box-height, 160px) + var(--wiki-logo-margin, 15px))); /* if not is-top-logo, height of navigation, else height of navigation + logo-height + logo-margin */ height: var(--height); } #mw-page-base { max-width: var(--wiki-page-content-max-width, 9999px); margin: auto; } #mw-head-base { width: calc(min(100%, var(--wiki-page-content-max-width, 9999px)) - var(--wiki-sidebar-width, 10em) - var(--wiki-gap-between-sidebar-and-content, 0.5em)); margin-top: calc(-1 * var(--height)); margin-left: calc(max(0px, 100% - var(--wiki-page-content-max-width, 9999px)) / 2 + var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em)); } /* let ul default to text that respects color */ ul { list-style-image: none; } /************************ * End general framework * *************************/ /************** * Vector tabs * ***************/ /* prevent margin collapse */ .content-wrapper::before { content: " "; display: table; } .content-wrapper{ --navigation-border-bottom-width: calc(var(--wiki-navigation-border-bottom-width, calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)))); } /****** navbar (#mw-head) ******/ .vector-menu-tabs .mw-list-item, #p-cactions, #p-variants { float: unset; line-height: 1.5; /* fallback */ line-height: round(nearest, calc(var(--wiki-navigation-font-size,0.8125em)*1.5), 1px); box-sizing: border-box; white-space: nowrap; } #mw-head { --icon-star-filled: url("data:image/svg+xml,%3C%3Fxml version='1.0'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' id='Outlined'%3E%3Cg style='fill:%23000000;fill-opacity:1' id='Fill'%3E%3Cpath style='fill:%23000000;fill-opacity:1' id='path1380' d='M 28.61,11.67 H 20 L 17.34,3.47 C 16.920093,2.1973942 15.119907,2.1973942 14.7,3.47 L 12,11.67 H 3.39 c -1.3409796,0.0031 -1.900508,1.71581 -0.82,2.51 l 7,5.07 -2.68,8.21 C 6.5980433,28.35747 7.2662365,29.278767 8.21,29.28 8.4953889,29.267666 8.7705436,29.170143 9,29 l 7,-5.07 7,5.07 c 0.236205,0.170386 0.518805,0.264586 0.81,0.27 0.943763,-0.0012 1.611957,-0.92253 1.32,-1.82 l -2.66,-8.21 7,-5.07 c 1.075277,-0.810084 0.486081,-2.522863 -0.86,-2.5 z' /%3E%3C/g%3E%3C/svg%3E"); --icon-star-empty: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M20 7h-7L10 .5 7 7H0l5.46 5.47-1.64 7 6.18-3.7 6.18 3.73-1.63-7zm-10 6.9-3.76 2.27 1-4.28L3.5 8.5h4.61L10 4.6l1.9 3.9h4.6l-3.73 3.4 1 4.28z'/%3E%3C/svg%3E%0A"); /* icon below is from https://tabler-icons.io/ */ --icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E"); margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em)); width: auto; height: var(--wiki-navigation-height); margin-top: calc(-1 * (var(--wiki-navigation-height) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0))); position: relative; display: flex; align-items: stretch; z-index: 4; /* above #mw-panel and .mw-indicators */ background: var(--wiki-navigation-box-background, none); border: calc(var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0)) var(--wiki-content-border-style, solid) var(--wiki-content-border-color); border-bottom-width: 0; border-radius: var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) 0 0; border-image: var(--wiki-navigation-box-border-image, none); backdrop-filter: var(--wiki-navigation-box-backdrop-filter, none); } /* top border of the content */ #mw-head::before { content: ""; display: block; box-sizing: border-box; position: absolute; top: calc(100% - min(var(--wiki-navigation-left-spacing, 0px) * 999, var(--navigation-border-bottom-width)) + var(--navigation-border-bottom-width)); left: 0; width: calc(max(var(--wiki-navigation-left-spacing, 0px), var(--navigation-border-bottom-width))); height: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width))); border: 0 var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); border-left-width: var(--navigation-border-bottom-width); border-top-width: var(--navigation-border-bottom-width); border-top-left-radius: calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0))); } #left-navigation, #right-navigation { float: none; margin: 0; display: flex; align-items: flex-end; margin-bottom: calc(-1 * var(--navigation-border-bottom-width)); } #left-navigation { flex: 0 0 auto; justify-content: flex-start; } #right-navigation { flex: 1 1 auto; justify-content: flex-end; } #left-navigation::before, #left-navigation::after, #right-navigation::before, #right-navigation::after { content: ""; display: block; height: 0; border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); flex: 0 0 auto; } #left-navigation::before { box-sizing: border-box; width: var(--wiki-navigation-left-spacing, 0px); border-bottom-width: 0; } #left-navigation::after { width: var(--wiki-navigation-gap-between-left-and-right); } #right-navigation::before { flex: 1 1 auto; width: auto; } #right-navigation::after { width: var(--wiki-navigation-right-spacing); display: none; /* only for desktop */ } /*** tabs ***/ /* reset */ .vector-menu, .vector-menu *, .vector-menu-tabs-legacy li { background: none; } .vector-menu input { border: 0; } /* tabs list */ .vector-menu-tabs { height: unset; padding: unset; } .vector-menu-tabs .vector-menu-content { height: 100%; } .vector-menu-tabs-legacy ul{ float: none; } .vector-menu-tabs .vector-menu-content-list { display: flex; align-items: flex-end; } /* tab */ .vector-menu-tabs .mw-list-item, .vector-menu-dropdown { /* outer box of normal tabs: border-bottom */ border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); position: relative; margin-right: max(0px, var(--wiki-navigation-tab-spacing)); /* make space for gap */ height: auto; padding-bottom: var(--wiki-navigation-bottom-spacing, 0px); cursor: auto; } .vector-menu-dropdown .vector-menu-checkbox{ height: calc(100% - var(--wiki-navigation-bottom-spacing, 0px)); } .vector-menu-tabs .mw-list-item::after, .vector-menu-dropdown::after { /* gap */ content: ""; display: block; width: max(0px, var(--wiki-navigation-tab-spacing)); height: 0; border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); position: absolute; left: 100%; bottom: calc(0px - var(--navigation-border-bottom-width)); } .vector-menu-tabs .mw-list-item + .mw-list-item, .vector-menu-dropdown { margin-left: calc(min(0px, var(--wiki-navigation-tab-spacing))); } .vector-menu-tabs .mw-list-item a, .vector-menu-tabs .mw-list-item a:visited, #mw-head .vector-menu-dropdown .vector-menu-heading { /* "#mw-head " is needed here to correctly overwriting mw default css */ /* inner box of normal tabs: tab style */ float: none; height: auto; margin: 0; padding: var(--wiki-navigation-tab-padding-top, 1.25em) var(--wiki-navigation-tab-padding-x, 0.75em) var(--wiki-navigation-tab-padding-bottom, 4px); border: var(--wiki-navigation-border-width, 1px) var(--wiki-navigation-border-style, solid) var(--wiki-navigation-border-color); border-bottom-width: calc(min(var(--wiki-navigation-bottom-spacing, 0px)*999, var(--wiki-navigation-border-width, 1px))); border-radius: var(--wiki-navigation-border-radius) var(--wiki-navigation-border-radius) 0 0; border-image: var(--wiki-navigation-border-image); color: var(--wiki-navigation-text-color); background-image: var(--wiki-navigation-background-image, none); background-color: color-mix(in srgb, var(--wiki-navigation-background-color) var(--wiki-navigation-background-opacity), transparent); background-size: var(--wiki-navigation-background-size, auto); background-repeat: var(--wiki-navigation-background-repeat, repeat); background-position: var(--wiki-navigation-background-position, center); font-size: var(--wiki-navigation-font-size, 0.8125em); backdrop-filter: var(--wiki-navigation-backdrop-filter, var(--wiki-navigation-selected-backdrop-filter, none)); } .vector-menu-tabs .mw-list-item a:hover, #mw-head .vector-menu-dropdown:hover .vector-menu-heading { border-color: var(--wiki-navigation-border-color--hover, var(--wiki-navigation-border-color)); color: var(--wiki-navigation-text-color--hover); border-image: var(--wiki-navigation-border-image--hover); background-image: var(--wiki-navigation-background-image--hover, var(--wiki-navigation-background-image, none)); background-color: color-mix(in srgb, var(--wiki-navigation-background-color--hover, var(--wiki-navigation-background-color)) var(--wiki-navigation-background-opacity--hover, var(--wiki-navigation-background-opacity)), transparent); background-size: var(--wiki-navigation-background-size--hover, var(--wiki-navigation-background-size, auto)); background-repeat: var(--wiki-navigation-background-repeat--hover, var(--wiki-navigation-background-repeat, repeat)); background-position: var(--wiki-navigation-background-position--hover, var(--wiki-navigation-background-position, center)); transform: var(--wiki-navigation-transform--hover, none); } .vector-menu-tabs .mw-list-item.selected { background: none; border-bottom-color: transparent; } .vector-menu-tabs .mw-list-item.selected a { /* inner box of selected tab: tab style */ background-image: var(--wiki-navigation-selected-background-image, none); background-color: color-mix(in srgb, var(--wiki-navigation-selected-background-color) var(--wiki-navigation-selected-background-opacity), transparent); background-size: var(--wiki-navigation-selected-background-size, auto); background-repeat: var(--wiki-navigation-selected-background-repeat, repeat); background-position: var(--wiki-navigation-selected-background-position, center); border: var(--wiki-navigation-selected-border-width, 1px) var(--wiki-navigation-selected-border-style, solid) var(--wiki-navigation-selected-border-color); border-bottom-width: calc(min(var(--wiki-navigation-bottom-spacing, 0px)*999, var(--wiki-navigation-selected-border-width, 1px))); border-image: var(--wiki-navigation-selected-border-image); color: var(--wiki-navigation-selected-text-color); backdrop-filter: var(--wiki-navigation-selected-backdrop-filter, none); } .vector-menu-tabs .mw-list-item.selected::before { content: ''; display: block; width: 100%; box-sizing: border-box; height: var(--navigation-border-bottom-width); border: var(--wiki-navigation-selected-border-width, var(--wiki-content-border-width, 1px)) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); border-top-width: 0; border-bottom-width: 0; position: absolute; bottom: calc(0px - var(--navigation-border-bottom-width)); background: var(--wiki-navigation-selected-border-bottom-background, transparent); background-clip: padding-box; } /* watch/unwatch star */ .vector-menu-tabs #ca-watch.icon a, .vector-menu-tabs #ca-unwatch.icon a { width: var(--wiki-navigation-icon-size, 1em); height: 100%; box-sizing: content-box; padding: var(--wiki-navigation-tab-padding-top, 1.25em) var(--wiki-navigation-tab-padding-x--icon, var(--wiki-navigation-tab-padding-x, 0.75em)) var(--wiki-navigation-tab-padding-bottom, 4px) var(--wiki-navigation-tab-padding-x--icon, var(--wiki-navigation-tab-padding-x, 0.75em)); color: transparent; /* for watch/unwatch, the text of <a> will be plain 'watch'/'unwatch' without <span> after clicking. */ display: flex; align-items: center; text-indent: 999px; } .vector-menu-tabs #ca-watch.icon a::before, .vector-menu-tabs #ca-unwatch.icon a::before { content: ""; display: block; position: unset; background-image: none !important; width: var(--wiki-navigation-icon-size, 1em); height: var(--wiki-navigation-icon-size, 1em); flex: 0 0 auto; --mask: var(--icon) no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--wiki-navigation-text-color); } .vector-menu-tabs #ca-watch.icon a:hover::before, .vector-menu-tabs #ca-unwatch.icon a:hover::before { background-color: var(--wiki-navigation-text-color--hover); } .vector-menu-tabs #ca-unwatch.icon .loading::before, .vector-menu-tabs #ca-watch.icon .loading::before{ transform-origin: 50% 56.25%; } .vector-menu-tabs #ca-watch.icon { /* line star */ --icon: var(--icon-star-empty); } .vector-menu-tabs #ca-unwatch.icon { /* solid star */ --icon: var(--icon-star-filled); } /*** dropdown menu ***/ .vector-menu-dropdown .vector-menu-heading { /* "More" */ /* tab label */ position: relative; display: flex; align-items: center; gap: 0.25em; } .vector-menu-dropdown .vector-menu-heading::after { /* arrow icon */ content: ""; display: block; width: 1em; height: 1em; margin-top: 1px; /* tweak offset */ --mask: var(--icon-chevron-down) no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background: unset; background-color: var(--wiki-navigation-text-color); filter: none; } .vector-menu-dropdown:hover .vector-menu-heading::after { /* .vector-menu-heading is covered by .vector-menu-checkbox, therefore we can't use .vector-menu-heading:hover::after */ background-color: var(--wiki-navigation-text-color--hover); } .vector-menu-dropdown .mw-list-item a:not(.vector-icon) { font-size: var(--wiki-navigation-dropdown-font-size, 0.8125em); } .vector-menu-dropdown .vector-menu-content { /* dropdown list body */ border: none; background: none; left: 0; /* reset */ margin: 0; /* reset */ top: calc(100% - var(--wiki-navigation-bottom-spacing, 0px)); overflow: unset; } .vector-menu-dropdown .vector-menu-content ul { border: var(--wiki-navigation-dropdown-border-width) solid var(--wiki-navigation-dropdown-border-color); border-radius: 0 0 var(--wiki-navigation-dropdown-border-radius) var(--wiki-navigation-dropdown-border-radius); border-image: var(--wiki-navigation-dropdown-border-image); background: color-mix(in srgb, var(--wiki-navigation-dropdown-background-color, var(--wiki-content-background-color)) var(--wiki-navigation-dropdown-background-opacity, var(--wiki-content-background-opacity, 100%)), transparent); box-shadow: var(--wiki-navigation-dropdown-box-shadow, var(--wiki-navigation-dropdown-shadow, none)); /* --wiki-navigation-dropdown-shadow is deprecated name */ backdrop-filter: var(--wiki-navigation-dropdown-backdrop-filter); padding: var(--wiki-navigation-dropdown-padding, 0); margin-top: var(--wiki-navigation-dropdown-offset, 0); } .vector-menu-dropdown .vector-menu-content li:hover { background: var(--wiki-navigation-dropdown-item-background--hover, none); } .vector-menu-dropdown .vector-menu-content li a { display: block; padding: var(--wiki-navigation-dropdown-item-padding, 0); } .vector-menu-dropdown .vector-menu-content li a, .vector-menu-dropdown .vector-menu-content li a:visited { color: var(--wiki-navigation-dropdown-text-color, var(--wiki-navigation-text-color)); } .vector-menu-dropdown .vector-menu-content li a:hover { color: var(--wiki-navigation-dropdown-text-color--hover, var(--wiki-navigation-text-color--hover, var(--wiki-content-link-color--hover))); /* fallback for backwards compatibility */ } /*** search form ***/ #p-search { margin: 0; padding: 0 calc(max(0px, var(--wiki-navigation-right-spacing, 0px))) calc(var(--wiki-navigation-search-bottom-spacing, 3px) + var(--navigation-border-bottom-width)) calc(max(0px, 3px - max(0px, var(--wiki-navigation-tab-spacing, -1px)))); z-index: 2; position: relative; font-size: var(--wiki-navigation-search-font-size, var(--wiki-navigation-font-size, 0.8125em)); } .vector-search-box form { margin: unset; } #p-search .searchButton { background-color: transparent; font-size: unset; } /*new search form */ .cdx-search-input--has-end-button .cdx-search-input__input-wrapper{ margin: 0; } .cdx-menu-item--enabled.cdx-menu-item--highlighted { background-color: var(--wiki-navigation-search-highlight-background-color); } #p-search input{ line-height: 1.25; /* "normal" behaves inconsistently in different browsers */ } #p-search input{ height: unset; min-height: var(--wiki-navigation-search-height, 2em); } #p-search button{ height: unset; min-height: var(--wiki-navigation-search-height, 2em); min-width: var(--wiki-navigation-search-height, 2em); top: 0; bottom: 0; right: 0; background-color: color-mix(in srgb, var(--wiki-navigation-search-button-color, currentColor) var(--wiki-navigation-search-button-color-opacity, 80%), transparent); opacity: 100%; } #p-search button:hover, #p-search button:focus{ background-color: color-mix(in srgb, var(--wiki-navigation-search-button-color--hover, var(--wiki-navigation-search-button-color, currentColor)) var(--wiki-navigation-search-button-color-opacity--hover, 95%), transparent); opacity: 100%; } /* top border of the content box */ #p-search::before { content: ""; display: block; width: calc(100% - calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width)))); height: 0; border-bottom: var(--navigation-border-bottom-width) var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)) var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); position: absolute; bottom: 0; left: 0; } /* top right border-radius of content area */ #p-search::after { content: ""; display: block; width: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width))); height: calc(max(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0)), var(--navigation-border-bottom-width))); box-sizing: border-box; border-width: var(--navigation-border-bottom-width) var(--navigation-border-bottom-width) 0 0; border-style: var(--wiki-navigation-border-bottom-style, var(--wiki-navigation-selected-border-style, solid)); border-color: var(--wiki-navigation-border-bottom-color, var(--wiki-navigation-selected-border-color)); border-radius: 0 calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0))) 0 0; position: absolute; top: calc(100% - var(--navigation-border-bottom-width)); right: 0; } /****************** * End vector tabs * *******************/ /******** * Links * *********/ a, .mw-parser-output a.external, .mw-parser-output a.extiw { color: var(--wiki-content-link-color); } a:visited, .mw-parser-output a.extiw:visited, .mw-parser-output a.external:visited { color: var(--wiki-content-link-color--visited); } a:not(.mw-selflink):hover, a:visited:hover, .mw-parser-output a.extiw:hover, .mw-parser-output a.extiw:visited:hover, .mw-parser-output a.external:hover, .mw-parser-output a.external:visited:hover { color: var(--wiki-content-link-color--hover); } a.new, a.new:visited, a.new:hover, .mw-usertoollinks-contribs-no-edits { color: var(--wiki-content-redlink-color); } a:not(.mw-selflink):active, a:visited:active, .mw-parser-output a.extiw:active, .mw-parser-output a.extiw:visited:active, .mw-parser-output a.external:active, .mw-parser-output a.external:visited:active { color: var(--wiki-warning-color); } /* link decorations */ /* move external marker to an after so we can filter it to link color */ .mw-parser-output a.external, .sitenotice a.external { background: none; padding-right: 0; } .mw-parser-output a.external::after, .sitenotice a.external::after, a.extiw[title="wgg:globalprefs"]::after { display: inline-block; width: 1em; height: 1em; margin-left: 0px; content: ''; vertical-align: text-top; --mask: var(--icon) no-repeat; --mask-size: 0.857em; --mask-position: center right; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: var(--mask-size); mask-size: var(--mask-size); -webkit-mask-position: var(--mask-position); mask-position: var(--mask-position); background-color: currentColor; } .mw-parser-output a.external::after, .sitenotice a.external::after { --icon: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E %3Cpath d=%22M6 1h5v5L8.86 3.85 4.7 8 4 7.3l4.15-4.16L6 1ZM2 3h2v1H2v6h6V8h1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Z%22/%3E %3C/svg%3E"); } a.extiw[title="wgg:globalprefs"]::after { --icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20aria-hidden%3D%22true%22%3E%3C!----%3E%3Cg%3E%3Cg%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20transform%3D%22translate(10%2010)%22%3E%3Cpath%20id%3D%22cdx-icon-settings-a%22%20d%3D%22M1.5-10h-3l-1%206.5h5m0%207h-5l1%206.5h3%22%3E%3C%2Fpath%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(45)%22%3E%3C%2Fuse%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(90)%22%3E%3C%2Fuse%3E%3Cuse%20xlink%3Ahref%3D%22%23cdx-icon-settings-a%22%20transform%3D%22rotate(135)%22%3E%3C%2Fuse%3E%3C%2Fg%3E%3Cpath%20d%3D%22M10%202.5a7.5%207.5%200%20000%2015%207.5%207.5%200%20000-15v4a3.5%203.5%200%20010%207%203.5%203.5%200%20010-7%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } .plainlinks a.external::after, .plainlinks a.extiw[title="wgg:globalprefs"]::after { display: none; } /* Using a background instead of an ::after prevents the icon from wrapping onto its own line, but prevents it from being recolored. Use this only for icons that should not be recolored, otherwise use the ::after method used for external links above */ a.extiw[title^="wikipedia:"], a.extiw[title^="wp:"], a.extiw[title^="mw:"], a.extiw[title^="support:"] { padding-right: 1em; background-position: center right; background-repeat: no-repeat; background-size: 0.857em; } a.extiw[title^="wikipedia:"], a.extiw[title^="wp:"] { background-image: url(https://commons.wiki.gg/images/2/28/Wikipedia.svg?202406) } a.extiw[title^="mw:"] { background-image: url(https://commons.wiki.gg/images/9/9b/MediaWiki.svg?202406) } a.extiw[title^="support:"] { background-image: url(https://commons.wiki.gg/images/9/9b/Wiki.gg_icon-pink.svg) } .plainlinks a.extiw { background-image:none; } /************ * End links * *************/ /*************** * Left Sidebar * ****************/ #mw-panel { width: var(--wiki-sidebar-width, 10em); box-sizing: border-box; position: relative; z-index: 1; /* above #footer */ top: calc(-1 * var(--wiki-is-navigation-inside-content, 0) * (var(--wiki-navigation-height) + var(--wiki-content-border-width,1px)) + var(--wiki-sidebar-offset, 0px)); margin-top: calc((1 - var(--wiki-is-top-logo, 0)) * (var(--wiki-logo-file-height, 160) / var(--wiki-logo-file-width, 160) * var(--wiki-sidebar-width, 10em) + var(--wiki-logo-margin, 15px))); /* if is-top-logo, logo-file ratio * sidebar-width + logo-margin, else 0 */ padding: var(--wiki-sidebar-box-padding, 0); background: var(--wiki-sidebar-box-background, none); border: var(--wiki-sidebar-box-border, 0); border-image: var(--wiki-sidebar-box-border-image, none); } #mw-panel .vector-menu-portal { background-color: color-mix(in srgb, var(--wiki-sidebar-background-color) var(--wiki-sidebar-background-opacity), transparent); background-image: var(--wiki-sidebar-background-image, none); background-size: var(--wiki-sidebar-background-size, auto); background-repeat: var(--wiki-sidebar-background-repeat, repeat); background-position: var(--wiki-sidebar-background-position, center); border: var(--wiki-sidebar-border-width, 1px) var(--wiki-sidebar-border-style, solid) var(--wiki-sidebar-border-color); border-image: var(--wiki-sidebar-border-image, none); margin: 0 var(--wiki-sidebar-margin, 0.5em); padding: var(--wiki-sidebar-padding, 0); filter: var(--wiki-sidebar-filter, none); backdrop-filter: var(--wiki-sidebar-backdrop-filter, none); overflow: hidden; /* to prevent overflow when combining border-radius with heading background */ } #mw-panel #p-ext-discordwidget{ backdrop-filter: none; } @supports not (color:color-mix(in srgb, #000, transparent)) { #mw-panel .vector-menu-portal { background-color: var(--wiki-sidebar-background-color); } } #mw-panel .vector-menu-portal + .vector-menu-portal { border-top-width: 0; } #mw-panel .vector-menu-portal:last-child { margin-bottom: 0; } /* Sidebar spacing and border-radius section */ #mw-panel .vector-menu-portal:not(:last-child) { margin-bottom: var(--wiki-sidebar-portal-spacing); } #mw-panel #p-logo + .vector-menu-portal, #mw-panel #p-ext-discordwidget + .vector-menu-portal { /* The way this works is that if the sidebar does not have any spacing, only the top and bottom corners of the top and bottom portals respectively should be rounded, instead of all corners of every portal. min and calc are combined here to basically create an `if x > 0 then y else z` function. The lower of (sidebar-border-radius) and (spacing * 999) are compared and the smaller value is taken (999 is simply an arbitrary large number). If portal spacing is zero, multiplying it gets 0 and will be the smaller value. If it's non-zero, it will be large and sidebar-border-radius will be the smaller value. This is only applied to the "inner" corners because we'd want the "outer" corners rounded in either scenario. */ border-radius: var(--wiki-sidebar-border-radius) var(--wiki-sidebar-border-radius) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)); } #mw-panel .vector-menu-portal:last-child { /* see rule above for explanation */ border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)) var(--wiki-sidebar-border-radius) var(--wiki-sidebar-border-radius); } #mw-panel .vector-menu-portal { /* see above rules for explanation */ border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)); } #mw-panel .vector-menu-portal + .vector-menu-portal { /* This keeps the border from doubling up if there is no spacing between them, The portals other than the first only have a top border if there is spacing */ border-top-width: min(var(--wiki-sidebar-border-width, 1px), var(--wiki-sidebar-portal-spacing, 0px)); /* the 1px and 0px fallbacks are for backwards compatibility with older versions of the loadout */ } #mw-panel #p-ext-discordwidget + .vector-menu-portal { border-top-width: var(--wiki-sidebar-border-width, 1px); } /* end sidebar spacing and border-radius */ .vector-menu-portal .vector-menu-heading { padding: var(--wiki-sidebar-heading-padding, 0.5rem 0.25rem 0.5rem 0.5rem); margin: var(--wiki-sidebar-heading-margin, 0 0 var(--wiki-sidebar-heading-margin-bottom, -0.5rem) 0); /* --wiki-sidebar-heading-margin-bottom is deprecated */ background: var(--wiki-sidebar-heading-background, none); border-image: var(--wiki-sidebar-heading-border-image, none); color: var(--wiki-sidebar-heading-color); font-family: var(--wiki-sidebar-heading-font-family); font-size: var(--wiki-sidebar-heading-font-size, 0.75em); font-weight: var(--wiki-sidebar-heading-font-weight, normal); font-style: var(--wiki-sidebar-heading-font-style, normal); text-transform: var(--wiki-sidebar-heading-text-transform, none); line-height: var(--wiki-sidebar-heading-line-height, normal); text-shadow: var(--wiki-sidebar-heading-text-shadow, none) } .vector-menu-portal .vector-menu-content { margin: var(--wiki-sidebar-list-margin, 0); padding: var(--wiki-sidebar-list-padding, 0.25rem); background: var(--wiki-sidebar-list-background, none); border-image: var(--wiki-sidebar-list-border-image, none); } .vector-menu-portal .vector-menu-content ul { padding: 0; display: flex; flex-direction: column; gap: var(--wiki-sidebar-list-item-spacing, 0); } .vector-menu-portal .vector-menu-content li { font-size: var(--wiki-sidebar-font-size, 0.75em); line-height: var(--wiki-sidebar-line-height, 1.125em); padding: 0; background: var(--wiki-sidebar-list-item-background, none); border-image: var(--wiki-sidebar-list-item-border-image, none); } .vector-menu-portal .vector-menu-content li:hover { background: var(--wiki-sidebar-list-item-background--hover, var(--wiki-sidebar-list-item-background, none)); border-image: var(--wiki-sidebar-list-item-border-image--hover, var(--wiki-sidebar-list-item-border-image, none)); } .vector-menu-portal .vector-menu-content li a { display: block; padding: var(--wiki-sidebar-list-item-padding, 0.25em 0.25rem); } .vector-menu-portal .vector-menu-content li a.feedlink{ /* Atom */ background: none; } .vector-menu-portal .vector-menu-content .mw-list-item a, .vector-menu-portal .vector-menu-content .mw-list-item a:visited, .vector-menu-portal .vector-menu-content li a, .vector-menu-portal .vector-menu-content li a:visited { color: var(--wiki-sidebar-link-color); } .vector-menu-portal .vector-menu-content .mw-list-item a:hover, .vector-menu-portal .vector-menu-content .mw-list-item a:visited:hover { color: var(--wiki-sidebar-link-color--hover, var(--wiki-content-link-color--hover)); /* fallback for backwards compatibility */ } #t-newpage { --sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 384 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M0 64C0 28.7 28.7 0 64 0H224V128c0 17.7 14.3 32 32 32H384V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V64zm384 64H256V0L384 128z%22%2F%3E%3C%2Fsvg%3E'); order: -1; } #t-upload { --sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 512 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M288 109.3V352c0 17.7-14.3 32-32 32s-32-14.3-32-32V109.3l-73.4 73.4c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l128-128c12.5-12.5 32.8-12.5 45.3 0l128 128c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L288 109.3zM64 352H192c0 35.3 28.7 64 64 64s64-28.7 64-64H448c35.3 0 64 28.7 64 64v32c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V416c0-35.3 28.7-64 64-64zM432 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z%22%2F%3E%3C%2Fsvg%3E'); order: -1; } #t-print { --sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 512 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zM432 248a24 24 0 1 1 0 48 24 24 0 1 1 0-48z%22%2F%3E%3C%2Fsvg%3E'); order: -1; } #t-whatlinkshere { --sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 640 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z%22%2F%3E%3C%2Fsvg%3E'); order: -1; } #t-specialpages { --sidebar-icon: url('data:image/svg+xml;charset=UTF-8,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 viewBox%3D%220 0 576 512%22%3E%3C!--%21Font Awesome Free 6.5.2 by %40fontawesome - https%3A%2F%2Ffontawesome.com License - https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree Copyright 2024 Fonticons%2C Inc.--%3E%3Cpath d%3D%22M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z%22%2F%3E%3C%2Fsvg%3E'); order: -1; } #t-cargopagevalueslink { --sidebar-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 126.971 136.024'%3E%3Cpath d='m105.999 0-84 .049L0 8.957v127.065h126.97V8.957Z' fill='none' display='inline' opacity='1' paint-order='normal'/%3E%3Cpath d='m9.735 8.774 12.265-5h84l12.25 5H9.75' fill='%23000' fill-opacity='1' display='inline'/%3E%3Cpath d='M3.5 41.024H28v63.5H3.5zm95.5 0h24.5v63.5H99zm-95.5 67.5H123v24H3.5zm0-95.5H123v24H3.5zm27.985 28V59.67l13.61 13.61 17.323 17.324 1.788 1.787 12.131 12.132h19.147v-16.21l-13.6-13.6-1.788-1.787-17.325-17.324-14.578-14.579H31.485zm45.865 0-12.2 12.2 17.324 17.324 13.01-13.01V41.024H77.35zM42.716 75.658l-11.23 11.231v17.634h17.013l11.541-11.54-17.324-17.325z' fill='%23000' fill-opacity='1' fill-rule='nonzero' display='inline' opacity='1' paint-order='normal'/%3E%3C/svg%3E"); order: -1; } #feedlinks{ --sidebar-icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg baseProfile='tiny' height='24px' id='Layer_1' version='1.2' viewBox='0 0 24 24' width='24px' xml:space='preserve' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M6.002,15.999C4.895,15.999,3.998,16.896,4,18c0,1.104,0.896,2.001,2.002,1.999C7.105,20.001,8.002,19.105,8,18 C8.002,16.893,7.105,15.997,6.002,15.999z'/%3E%3Cpath d='M6,4C4.896,4,4,4.896,4,6s0.896,2,2,2c5.514,0,10,4.486,10,10c0,1.104,0.896,2,2,2s2-0.896,2-2C20,10.28,13.72,4,6,4z'/%3E%3Cpath d='M6,10c-1.104,0-2,0.896-2,2s0.896,2,2,2c2.205,0,4,1.794,4,4c0,1.104,0.896,2,2,2s2-0.896,2-2C14,13.589,10.411,10,6,10z'/%3E%3C/svg%3E"); order: -1; } #t-specialpages > a::before, #t-whatlinkshere > a::before, #t-print > a::before, #t-newpage > a::before, #t-upload > a::before, #t-cargopagevalueslink > a::before, #feedlinks > a::before { content: ''; background-image: var(--sidebar-icon); background-size: contain; background-repeat: no-repeat; background-position: center; display: inline-block; width: 1.25em; height: 1.25em; } #p-tb .mw-list-item > a::before { filter: var(--wiki-sidebar-icon-to-link-filter, var(--wiki-icon-to-link-filter)); } #p-tb .mw-list-item > a { display: flex; align-items: center; gap: 3px; } /******************* * End left sidebar * ********************/ /******* * Logo * ********/ /* [[File:Site-logo.png]] */ #p-logo { width: var(--wiki-logo-box-width); height: var(--wiki-logo-box-height); position: absolute; top: calc(-1 * ( (var(--wiki-navigation-height, 3rem) + var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) - var(--wiki-is-navigation-inside-content, 0) * (var(--wiki-navigation-height)) + var(--wiki-sidebar-offset, 0px)) * var(--wiki-is-top-logo, 0) + (var(--wiki-logo-box-height) + var(--wiki-logo-margin,15px)) * (1 - var(--wiki-is-top-logo, 0)) )); left: calc((min((100vw - var(--wiki-left-spacing, 0.5em) - var(--wiki-right-spacing, 0px) - 18px), var(--wiki-page-content-max-width, 9999px)) - var(--wiki-logo-box-width)) / 2 * var(--wiki-is-top-logo, 0)); margin: 0; filter: var(--wiki-logo-filter, none); } #p-logo a { background-size: contain; position: absolute; top: var(--wiki-logo-offset-y, 0); left: var(--wiki-logo-offset-x, 0); bottom: 0; right: 0; width: 100%; height: 100%; background-image: var(--wiki-logo-image, url(filepath://Site-logo.png)); /* The canonical logo must be Site-logo.png. This variable is mainly used to provide different logo for different themes. */ } /*********** * End logo * ************/ /*************** * Content area * ****************/ .content-wrapper { max-width: var(--wiki-page-content-max-width, none); margin-left: auto; margin-right: auto; } .mw-body, .parsoid-body { color: var(--wiki-content-text-color); background-color: color-mix(in srgb, var(--wiki-content-background-color) var(--wiki-content-background-opacity), transparent); margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em)); margin-top: unset; border-top: 0; border-left: var(--wiki-content-border-width, 1px) solid transparent; border-right: var(--wiki-content-border-width, 1px) solid transparent; border-bottom: var(--wiki-content-border-bottom-width, 1px) solid transparent; border-radius: calc((1 - var(--wiki-is-navigation-inside-content, 0)) * min(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)), var(--wiki-navigation-left-spacing, 0px))) calc((1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))); position: relative; border-image: var(--wiki-content-border-image, none); } @supports not (color:color-mix(in srgb, #000, transparent)) { .mw-body, .parsoid-body { background-color: var(--wiki-content-background-color); } } /* apply backdrop-filter on .mw-body results in the creation of a containing block for absolute and fixed positioned descendants, so we have to move it to here */ .mw-body::before, .parsoid-body::before{ content: ''; display: block; backdrop-filter: var(--wiki-content-backdrop-filter, none); position: absolute; top: 0; bottom: 0; left: 0; right: 0; z-index: -1; border-radius: calc((1 - var(--wiki-is-navigation-inside-content, 0)) * min(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)), var(--wiki-navigation-left-spacing, 0px))) calc((1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))); /* as .mw-body */ } .mw-body::after, .parsoid-body::after { content: ''; display: block; box-sizing: border-box; position: absolute; left: calc(-1 * var(--wiki-content-border-width, 1px)); right: calc(-1 * var(--wiki-content-border-width, 1px)); top: calc(var(--wiki-content-border-top-radius, var(--wiki-content-border-radius, 0px)) * (1 - var(--wiki-is-navigation-inside-content, 0))); bottom: calc(-1 * var(--wiki-content-border-bottom-width, 1px)); pointer-events: none; border-left: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color); border-right: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color); border-bottom: var(--wiki-content-border-bottom-width, 1px) var(--wiki-content-border-bottom-style, solid) var(--wiki-content-border-bottom-color, var(--wiki-content-border-color)); border-radius: 0 0 calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-content-border-radius, 0px))); } #mw-data-after-content { max-width: calc(var(--wiki-page-content-max-width) - var(--wiki-sidebar-width) - var(--wiki-gap-between-sidebar-and-content)); margin-left: calc(var(--wiki-sidebar-width) + var(--wiki-gap-between-sidebar-and-content) + max(0px, 100% - var(--wiki-page-content-max-width)) / 2); box-sizing: border-box; color: var(--wiki-content-text-color); background-color: color-mix(in srgb, var(--wiki-content-background-color) var(--wiki-content-background-opacity), transparent); } #mw-data-after-content .read-more-container { border: var(--wiki-content-border-width, 1px) var(--wiki-content-border-style, solid) var(--wiki-content-border-color); border-top-width: 0; border-bottom: var(--wiki-content-border-bottom-width, 1px) var(--wiki-content-border-bottom-style, solid) var(--wiki-content-border-bottom-color, var(--wiki-content-border-color)); padding: 1em; margin: 0; } #mw-data-after-content .read-more-container:empty { display: none; } @media screen and (min-width: 982px) { #mw-data-after-content .read-more-container { padding: 1.25em 1.5em 1.5em 1.5em; } } .mw-footer { max-width: calc(var(--wiki-page-content-max-width, 9999px) - var(--wiki-sidebar-width, 10em) - var(--wiki-gap-between-sidebar-and-content, 0.5em)); box-sizing: border-box; background-color: color-mix(in srgb, var(--wiki-footer-background-color, var(--wiki-content-background-color)) var(--wiki-footer-background-opacity, var(--wiki-content-background-opacity)), transparent); border: var(--wiki-footer-border-width, 1px) var(--wiki-footer-border-style, solid) var(--wiki-footer-border-color, var(--wiki-content-border-color)); border-top-width: calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-width, 1px))); margin-top: var(--wiki-spacing-before-footer, 0px); border-radius: calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)))) calc(min(var(--wiki-spacing-before-footer, 0px) * 999, var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)))) var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)) var(--wiki-footer-border-radius, var(--wiki-content-border-radius, 0px)); margin-left: calc(var(--wiki-sidebar-width, 10em) + var(--wiki-gap-between-sidebar-and-content, 0.5em) + max(0px, 100% - var(--wiki-page-content-max-width, 9999px)) / 2); color: var(--wiki-footer-text-color); border-image: var(--wiki-footer-border-image, none); backdrop-filter: var(--wiki-footer-backdrop-filter, none); } @supports not (color:color-mix(in srgb, #000, transparent)) { .mw-footer { background-color: var(--wiki-footer-background-color, var(--wiki-content-background-color)); } } .mw-footer li { color: var(--wiki-footer-text-color); } .mw-footer a, .mw-footer a:visited { color: var(--wiki-footer-link-color); } .mw-footer a:hover, .mw-footer a:visited:hover { color: var(--wiki-footer-link-color--hover); } /* fix */ @media screen and (max-width: 900px) { #footer-icons, #footer-places { clear: unset; } } /******************************* * End content area and footer * *******************************/ /*********** * Headings * ************/ .mw-body h1 { border-bottom: var(--wiki-content-firstheading-border-bottom-width, var(--wiki-content-heading-border-bottom-width, 1px)) var(--wiki-content-firstheading-border-style, var(--wiki-content-heading-border-style, solid)) var(--wiki-content-firstheading-border-color, var(--wiki-content-heading-border-color, var(--wiki-content-border-color))); font-size: var(--wiki-content-firstheading-font-size, 1.8em); font-family: var(--wiki-content-firstheading-font-family, var(--wiki-content-heading-font-family)); font-weight: var(--wiki-content-firstheading-font-weight, var(--wiki-content-heading-font-weight)); font-style: var(--wiki-content-firstheading-font-style, var(--wiki-content-heading-font-style)); text-transform: var(--wiki-content-firstheading-text-transform, var(--wiki-content-heading-text-transform)); line-height: var(--wiki-content-firstheading-line-height, var(--wiki-content-heading-line-height)); color: var(--wiki-content-firstheading-color, var(--wiki-content-heading-color)); text-shadow: var(--wiki-content-firstheading-text-shadow, var(--wiki-content-heading-text-shadow, none)); } .mw-body h2 { border-bottom: var(--wiki-content-heading-border-bottom-width, 1px) var(--wiki-content-heading-border-style, solid) var(--wiki-content-heading-border-color, var(--wiki-content-border-color)); font-size: var(--wiki-content-heading-h2-font-size, 1.5em); font-family: var(--wiki-content-heading-font-family); font-weight: var(--wiki-content-heading-font-weight, normal); font-style: var(--wiki-content-heading-font-style, normal); text-transform: var(--wiki-content-heading-text-transform, none); line-height: var(--wiki-content-heading-line-height, normal); color: var(--wiki-content-heading-color); text-shadow: var(--wiki-content-heading-text-shadow, none); } .mw-body h3, .mw-body h4, .mw-body h5, .mw-body h6{ border-bottom: var(--wiki-content-subheading-border-bottom-width, 0) var(--wiki-content-subheading-border-style, var(--wiki-content-heading-border-style, solid)) var(--wiki-content-subheading-border-color, var(--wiki-content-heading-border-color, var(--wiki-content-border-color))); font-family: var(--wiki-content-subheading-font-family, var(--wiki-body-font-family)); font-weight: var(--wiki-content-subheading-font-weight, bold); font-style: var(--wiki-content-subheading-font-style, normal); text-transform: var(--wiki-content-subheading-text-transform, none); line-height: var(--wiki-content-subheading-line-height, var(--wiki-content-heading-line-height)); color: var(--wiki-content-subheading-color, var(--wiki-content-heading-color)); text-shadow: var(--wiki-content-subheading-text-shadow, var(--wiki-content-heading-text-shadow, none)); } .mw-body h3{ font-size: var(--wiki-content-heading-h3-font-size, 1.2em); } .mw-body h4{ font-size: var(--wiki-content-heading-h4-font-size, 114%); } .mw-body h5{ font-size: var(--wiki-content-heading-h5-font-size, 108%); } .mw-body h6{ font-size: var(--wiki-content-heading-h6-font-size, 100%); } .mw-editsection-bracket, .mw-editsection-divider { color: var(--wiki-content-heading-color); } /*************** * End headings * ****************/ /************* * Wikitables * **************/ .wikitable { background: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .wikitable > tr > th, .wikitable > * > tr > th { background: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } .wikitable > tr > td, .wikitable > * > tr > td { border: 1px solid var(--wiki-content-border-color); } /* Forward = yes bg on Special:Interwiki */ table.mw-interwikitable.body td.mw-interwikitable-local-yes { background: color-mix(in srgb, var(--wiki-success-color) 25%, transparent); } .zebra-table > * > tr:nth-of-type(2n), .zebra-table > tr:nth-of-type(2n) { background: color-mix(in srgb, var(--wiki-content-dynamic-color--secondary) 5%, transparent); } .client-js .sortable:not(.jquery-tablesorter) > * > tr:first-child > th:not(.unsortable), .jquery-tablesorter th.headerSort { background-image: unset; position: relative; } .client-js .sortable:not(.jquery-tablesorter) > * > tr:first-child > th:not(.unsortable)::after, .jquery-tablesorter th.headerSort::after { content: ""; display: block; position: absolute; top: 0; right: 0; width: 21px; height: 100%; --mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%229%22 viewBox=%220 0 21 9%22%3E %3Cpath d=%22m14.5 5-4 4-4-4zm0-1-4-4-4 4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: auto; mask-size: auto; -webkit-mask-position: center right; mask-position: center right; background-color: var(--wiki-content-link-color); } .jquery-tablesorter th.headerSortUp::after { --mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%224%22 viewBox=%220 0 21 4%22%3E %3Cpath d=%22m6.5 4 4-4 4 4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat; } .jquery-tablesorter th.headerSortDown::after { --mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2221%22 height=%224%22 viewBox=%220 0 21 4%22%3E %3Cpath d=%22m14.5 0-4 4-4-4z%22 fill=%22%23fff%22/%3E %3C/svg%3E") no-repeat; } /***************** * End wikitables * ******************/ /************** * Preferences * ***************/ .mw-prefs-tabs-wrapper.oo-ui-panelLayout-framed, .mw-prefs-tabs > .oo-ui-menuLayout-content > .oo-ui-indexLayout-stackLayout > .oo-ui-tabPanelLayout { border: none; } .oo-ui-tabSelectWidget-framed { background-color: transparent; border-bottom: 1px solid var(--wiki-accent-color); } .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled, .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover { background-color: color-mix(in srgb, var(--wiki-accent-label-color) 75%, transparent); color: var(--wiki-accent-color); } .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover { color: var(--wiki-accent-color--hover); } .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected, .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget-selected:hover { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .oo-ui-tabSelectWidget-framed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected .oo-ui-labelElement-label { border-bottom: none; } #preferences .mw-htmlform-submit-buttons { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle, .oo-ui-dropdownInputWidget.oo-ui-widget-enabled, .oo-ui-textInputWidget .oo-ui-inputWidget-input, .oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input[readonly]:not(.oo-ui-pendingElement-pending) { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-content-border-color); } .oo-ui-pendingElement-pending { background-color: var(--wiki-content-background-color--secondary); background-image: linear-gradient(135deg, var(--wiki-content-background-color) 25%, transparent 25%, transparent 50%, var(--wiki-content-background-color) 50%, var(--wiki-content-background-color) 75%, transparent 75%, transparent); } .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select { color: var(--wiki-content-text-color); border-color: var(--wiki-content-border-color) } .view-dark .oo-ui-inputWidget-input.oo-ui-indicator-down { background-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E%3Ctitle%3E down %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M9.9 2.9 6 6.8 2.1 2.9 1 4l5 5 5-5z%22/%3E%3C/g%3E%3C/svg%3E"); } .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover { color: var(--wiki-content-text-mix-color); border-color: var(--wiki-accent-color); } .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active { color: var(--wiki-content-dynamic-color); border-color: var(--wiki-accent-color) } .oo-ui-dropdownInputWidget select option, .oo-ui-dropdownInputWidget select optgroup { color: #000; } .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover, .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:focus, .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:active, .oo-ui-dropdownInputWidget.oo-ui-widget-enabled:hover, .oo-ui-dropdownInputWidget.oo-ui-widget-enabled:focus, .oo-ui-dropdownInputWidget.oo-ui-widget-enabled:active, .oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input, .oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input:focus, .oo-ui-textInputWidget.oo-ui-widget-enabled:active .oo-ui-inputWidget-input, .oo-ui-textInputWidget.oo-ui-widget-enabled:hover .oo-ui-inputWidget-input:focus { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-accent-color); box-shadow: none; } .oo-ui-radioInputWidget [type="radio"] + span { background-color: var(--wiki-content-dynamic-color--inverted); } .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span, .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:hover + span { border-color: color-mix(in srgb, var(--wiki-accent-color) 90%, transparent); } .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:hover + span { border-color: var(--wiki-accent-color); } .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span, .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:active + span { background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:focus + span::before { border-color: var(--wiki-content-dynamic-color--inverted); } .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked:active + span { border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .oo-ui-menuOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget { color: var(--wiki-content-text-color); border-color: var(--wiki-content-text-mix-color); } .oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-selected, .oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-highlighted, .oo-ui-menuOptionWidget.oo-ui-optionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected, .oo-ui-dropdownWidget.oo-ui-widget-enabled.oo-ui-dropdownWidget-open .oo-ui-dropdownWidget-handle { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); color: var(--wiki-content-text-color); } .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted, .oo-ui-menuOptionWidget.oo-ui-optionWidget-pressed.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted { background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent); color: var(--wiki-accent-color); } .mw-prefs-tabs.mw-prefs-tabs-searching .oo-ui-tabPanelLayout.mw-prefs-search-matched > fieldset > legend { background: var(--wiki-content-background-color--secondary); } .mw-prefs-search-highlight { background-color: color-mix(in srgb, var(--wiki-accent-color) 7%, transparent) !important; outline-color: color-mix(in srgb, var(--wiki-accent-color) 7%, transparent) !important; } /**************** * End preferences * *****************/ /*************** * Page history * ****************/ #pagehistory li { background-color: transparent; border: none; } #pagehistory li.selected { background-color: var(--wiki-content-background-color--secondary); border: 1px dashed var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .diff td.diff-addedline { background-color: var(--wiki-content-background-color); border-color: var(--wiki-success-color); border-width: 1px 1px 1px 4px; } .diff td.diff-addedline .diffchange { background-color: var(--wiki-success-color); color: var(--wiki-success-label-color); } .diff td.diff-deletedline { background-color: var(--wiki-content-background-color); border-color: var(--wiki-alert-color); border-width: 1px 1px 1px 4px; } .diff td.diff-deletedline .diffchange { background-color: var(--wiki-alert-color); color: var(--wiki-alert-label-color) } .diff td.diff-context { background: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 80%, var(--wiki-content-background-color)); border-color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */ color: var(--wiki-content-text-color); } .diff-marker a.mw-diff-movedpara-right { color: transparent; } .diff-marker a.mw-diff-movedpara-right:hover:after { opacity: .75; } .diff-marker a.mw-diff-movedpara-right:after { color: var(--wiki-content-text-color); content: "\21a9"; } .diff-marker a.mw-diff-movedpara-left { color: transparent; } .diff-marker a.mw-diff-movedpara-left:hover:after { opacity: .75; } .diff-marker a.mw-diff-movedpara-left:after { color: var(--wiki-content-text-color); content: "\21aa"; } .mw-plusminus-neg { color: var(--wiki-alert-color); } .mw-plusminus-null { color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */ } .mw-plusminus-pos { color: var(--wiki-success-color); } .updatedmarker { background-color: color-mix(in srgb, var(--wiki-success-color) 25%, transparent); color: var(--wiki-content-text-color); } li span.deleted, span.history-deleted { color: var(--wiki-content-text-mix-color); } span.mw-history-suppressed { /* overrides above, since suppressed is also deleted */ color: var(--wiki-content-text-color); } /* inline diff (1.41) */ .mw-diff-inline-header { border-bottom: 1px solid var(--wiki-content-border-color); } .mw-diff-inline-added ins, .mw-diff-inline-changed ins, .mw-diff-inline-moved ins, .mw-diff-table-prefix .mw-diff-inline-legend .mw-diff-inline-legend-ins, .mw-diff-inline-added.mw-diff-empty-line::after, .mw-inline-diff-newline::after { background: color-mix(in srgb, var(--wiki-success-color) 90%, transparent); color: var(--wiki-success-label-color); display: inline-block; } .mw-diff-inline-added.mw-diff-empty-line::after, .mw-diff-inline-deleted.mw-diff-empty-line::after, .mw-inline-diff-newline::after { padding: 0.4em 0; } .mw-diff-inline-deleted del, .mw-diff-inline-changed del, .mw-diff-inline-moved del, .mw-diff-table-prefix .mw-diff-inline-legend .mw-diff-inline-legend-del, .mw-diff-inline-deleted.mw-diff-empty-line::after { background: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent); color: var(--wiki-alert-label-color); display: inline-block; } .mw-diff-movedpara-left::after, .mw-diff-movedpara-right::after { color: var(--wiki-content-text-color); } .ve-ui-diffElement-hasDescriptions .ve-ui-diffElement-content { border-right-color: var(--wiki-content-border-color); } .ve-ui-diffElement-attributeChange { color: var(--wiki-content-text-mix-color); } .ve-ui-diffElement-attributeChange ins { background-color: color-mix(in srgb, var(--wiki-success-color) 90%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-success-color) 90%, transparent); color: var(--wiki-success-label-color); } .ve-ui-diffElement-attributeChange del { background-color: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent); box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-alert-color) 90%, transparent); color: var(--wiki-alert-label-color); } .ve-ui-diffElement-highlight { outline-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .ve-ui-changeDescriptionsSelectWidget > .oo-ui-optionWidget-highlighted { background: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); } /* Edit conflict */ .mw-twocolconflict-split-tour-image-dual-column-view-1 { filter: var(--wiki-icon-general-filter); } .mw-twocolconflict-split-tour-image-blue-dot { filter: brightness(0) var(--wiki-icon-to-link-filter); } .mw-pulsating-dot::before, .mw-pulsating-dot::after { background-color: var(--wiki-content-link-color); } .mw-twocolconflict-split-current-version-header .mw-twocolconflict-revision-label { background-color: var(--wiki-alert-color); color: var(--wiki-alert-label-color); } .mw-twocolconflict-special-your-version-header .mw-twocolconflict-revision-label, .mw-twocolconflict-split-your-version-header .mw-twocolconflict-revision-label { background-color: var(--wiki-success-color); color: var(--wiki-success-label-color); } .mw-twocolconflict-single-column.mw-twocolconflict-split-copy, .mw-twocolconflict-split-column.mw-twocolconflict-split-copy { border-color: var(--wiki-neutral-color, var(--wiki-content-text-mix-color)); /* fallback for backwards compatibility */ background-color: var(--wiki-content-text-mix-color-95); } .mw-twocolconflict-single-column .mw-twocolconflict-split-collapsed .mw-twocolconflict-split-fade, .mw-twocolconflict-split-column .mw-twocolconflict-split-collapsed .mw-twocolconflict-split-fade { background-image: linear-gradient(transparent, var(--wiki-content-text-mix-color-95)); } .mw-twocolconflict-single-column, .mw-twocolconflict-split-column { background-color: var(--wiki-content-background-color); color: var(--wiki-content-text-color); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected { color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-delete, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-delete { border-color: color-mix(in srgb, var(--wiki-alert-color) 40%, transparent); } .mw-twocolconflict-single-column.mw-twocolconflict-split-delete, .mw-twocolconflict-split-column.mw-twocolconflict-split-delete { border-color: var(--wiki-alert-color); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-add, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected.mw-twocolconflict-split-add { border-color: color-mix(in srgb, var(--wiki-success-color) 40%, transparent); } .mw-twocolconflict-single-column.mw-twocolconflict-split-add, .mw-twocolconflict-split-column.mw-twocolconflict-split-add { border-color: var(--wiki-success-color); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange { background-color: color-mix(in srgb, var(--wiki-alert-color) 30%, transparent); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected del.mw-twocolconflict-diffchange, .mw-twocolconflict-single-column del.mw-twocolconflict-diffchange, .mw-twocolconflict-split-column del.mw-twocolconflict-diffchange { background-color: var(--wiki-alert-color); color: var(--wiki-alert-label-color); } .mw-twocolconflict-single-column.mw-twocolconflict-split-unselected ins.mw-twocolconflict-diffchange, .mw-twocolconflict-split-column.mw-twocolconflict-split-unselected ins.mw-twocolconflict-diffchange, .mw-twocolconflict-single-column ins.mw-twocolconflict-diffchange, .mw-twocolconflict-split-column ins.mw-twocolconflict-diffchange { background-color: var(--wiki-success-color); color: var(--wiki-success-label-color); } .mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span, .mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span, .mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget [type="radio"] + span { border-color: color-mix(in srgb, var(--wiki-success-color) 80%, transparent); background: color-mix(in srgb, var(--wiki-success-color) 10%, transparent); } .mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span, .mw-twocolconflict-split-selection > div:nth-child(2) .oo-ui-radioInputWidget [type="radio"] + span { border-color: color-mix(in srgb, var(--wiki-success-color) 90%, transparent); background: color-mix(in srgb, var(--wiki-success-color) 10%, transparent); } .mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:checked + span, .mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget.oo-ui-widget-enabled [type="radio"]:active + span, .mw-twocolconflict-split-selection > div:nth-child(1) .oo-ui-radioInputWidget [type="radio"] + span { border-color: color-mix(in srgb, var(--wiki-alert-color) 90%, transparent); background: color-mix(in srgb, var(--wiki-alert-color) 10%, transparent); } .mw-twocolconflict-split-editable .mw-twocolconflict-split-editor { color: var(--wiki-content-text-color); } /**/ /******************* * End page history * ********************/ /******************** * Table of contents * *********************/ #toc, .toc, .toccolours, .mw-warning { background: var(--wiki-content-toc-background, var(--wiki-content-background-color--secondary)); border-width: var(--wiki-content-toc-border-width, 1px); border-style: var(--wiki-content-toc-border-style, solid); border-color: var(--wiki-content-toc-border-color, var(--wiki-content-border-color)); border-radius: var(--wiki-content-toc-border-radius, 0px); border-image: var(--wiki-content-toc-border-image, none); box-shadow: var(--wiki-content-toc-box-shadow, none); } #mw-toc-heading { border: 0; } .toctogglelabel { color: var(--wiki-content-link-color); } .tocnumber { color: var(--wiki-content-text-color); } /************************ * End table of contents * *************************/ /************* * Thumbnails * **************/ img.thumbborder { border: 1px solid var(--wiki-content-border-color); padding: 5px; } div.thumbinner { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } li.gallerybox div.thumb { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } html .thumbimage { background-color: unset; border: 1px solid var(--wiki-content-border-color); } .thumb, .thumb .thumbinner, .thumb .thumbimage { max-width: 100%; box-sizing: border-box; } .thumb .thumbimage:not(audio) { height: auto; } body.skin--responsive .mw-parser-output .thumb .thumbinner > .thumbcaption { width: revert; } /* packed-overlay and packed-hover modes for galleries */ ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper, ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper, ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper { background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 65%, transparent); } /* for non-thumbnail left floaters, increased margin from 0.5em to account for <ul> */ div.floatleft, table.floatleft { margin-right: 1.4em; } /* Responsive floating thumbnails */ @media screen and (max-width: 720px) { div.tright, div.floatright, div.tleft, div.floatleft { float: none; margin: 0 auto; width: fit-content; } } /***************** * End thumbnails * ******************/ /************** * Wiki editor * ***************/ #wpTextbox0 { /* need !important here to override inline styling */ background-color: var(--wiki-content-background-color) !important; } .wikiEditor-ui { border: none; } .wikiEditor-ui .wikiEditor-ui-top, .wikiEditor-ui .wikiEditor-ui-view { border-color: var(--wiki-content-border-color); } .wikiEditor-ui-toolbar { background: var(--wiki-content-background-color--secondary); } .wikiEditor-ui-toolbar .group, .wikiEditor-ui-toolbar .section-secondary .group { border-color: var(--wiki-content-border-color); } .wikiEditor-ui-toolbar .tabs span.tab a, .wikiEditor-ui-toolbar .tabs span.tab a:visited, .wikiEditor-ui-toolbar .tabs span.tab a.current, .wiikiEditor-ui-toolbar .tabs span.tab a.current:visited, .wikiEditor-ui-toolbar .booklet .index .current { color: var(--wiki-content-link-color); } .wikiEditor-ui-toolbar .group .tool-select .options { background: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } .wikiEditor-ui-toolbar .group .tool-select .options .option { color: var(--wiki-content-text-color); } .wikiEditor-ui-toolbar .group .tool-select .menu .options .option:hover { background-color: var(--wiki-content-background-color); } .wikiEditor-ui-toolbar .tabs span.tab a::before, .wikiEditor-ui-toolbar .group .tool-select .label::after { filter: var(--wiki-icon-general-filter); } .wikiEditor-ui-toolbar .group .label, .wikiEditor-ui-toolbar .group .tool-select .label, .wikiEditor-ui-toolbar .page-table th, .wikiEditor-ui-toolbar .page-table td, .wikiEditor-ui-toolbar .page-characters div span, .wikiEditor-ui-toolbar .booklet .index div { color: var(--wiki-content-text-color); } .wikiEditor-ui-toolbar .booklet > .index > :hover { background-color: var(--wiki-content-background-color--secondary); } .wikiEditor-ui-toolbar .page-characters div span { border: 1px solid var(--wiki-content-border-color); } .wikiEditor-ui-toolbar .sections .section, .wikiEditor-ui-toolbar .booklet .pages, .wikiEditor-ui-toolbar .booklet .index .current, .wikiEditor-ui-toolbar .page-characters div span:hover { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent); } .wikiEditor-ui-toolbar .sections .section { border-top: 1px solid var(--wiki-content-border-color); } .wikiEditor-ui-toolbar .page-characters div span:hover { border-color: var(--wiki-content-border-color); } .wikiEditor-ui-toolbar .page-table td { border-top: 1px solid var(--wiki-content-border-color); } .wikiEditor-ui-tabs div a { background: #9A647F; display: inline-block; } .wikiEditor-ui-tabs div.current { border-bottom: 1px solid #3B3352; } .wikiEditor-ui-tabs div.current a { font-weight: bold; } .wikiEditor-ui-tabs { border-left: 1px solid #3B3352; border-top: 1px solid #3B3352; } .wikiEditor-ui-text { background-color: var(--wiki-content-dynamic-color--inverted); } .wikiEditor-preview-contents { background: transparent; background-color: rgba(255, 255, 255, 0.2); border-color: #3B3352; border-style: solid; border-width: 0 1px 1px; } .wikiEditor-ui-controls { background: transparent; } .wikiEditor-preview-contents, .wikiEditor-preview-loading { background-color: transparent; } .mw-wikiEditor-InsertLink-TitleInputField .oo-ui-messageWidget, .mw-widget-titleWidget-menu .mw-widget-titleOptionWidget-description { color: var(--wiki-content-text-mix-color); } .wikiEditor-toolbar-dialog { max-width: 100%; box-sizing: border-box; } .wikiEditor-toolbar-dialog .ui-dialog-content input[type='text']::placeholder { color: var(--wiki-content-text-mix-color); } .ext-WikiEditor-ResizingDragBar { background-color: var(--wiki-content-background-color--secondary); } .ext-WikiEditor-ResizingDragBar-ns { border-color: var(--wiki-content-border-color); } .ext-WikiEditor-ResizingDragBar span { background-color: var(--wiki-content-border-color); } .ext-WikiEditor-ResizingDragBar:hover span { background-color: var(--wiki-content-text-mix-color); } .ext-WikiEditor-twopanes-TwoPaneLayout .ext-WikiEditor-twopanes-pane1, .ext-WikiEditor-twopanes-TwoPaneLayout .ext-WikiEditor-twopanes-pane2 { border-color: var(--wiki-content-border-color); } /* creates a warning message about previewing sidebar edits */ .page-MediaWiki_Sidebar .wikiEditor-ui-bottom:has(.ext-WikiEditor-twopanes-TwoPaneLayout)::before { content:"Warning: Sidebar previews are not accurate. Please save to see your changes!"; background:var(--wiki-alert-color); display:block; text-align:center; color:var(--wiki-alert-label-color); } .ext-WikiEditor-realtimepreview-button.oo-ui-toggleWidget-on .oo-ui-labelElement-label { color: var(--wiki-accent-color); } .wikiEditor-ui-toolbar .group, .wikiEditor-ui-toolbar .section-secondary .group { border-color: var(--wiki-content-border-color); } .ext-WikiEditor-realtimepreview-button:hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); box-shadow: inset 0 0 3px var(--wiki-accent-color); } .ext-WikiEditor-realtimepreview-ErrorLayout { background-color: var(--wiki-content-background-color); } .ext-WikiEditor-image-realtimepreview-error { filter: var(--wiki-icon-general-filter); } .oo-ui-toggleButtonWidget.oo-ui-widget-enabled.oo-ui-buttonElement-frameless.oo-ui-toggleWidget-on .oo-ui-buttonElement-button { background-color: var(--wiki-content-background-color--secondary); } .ext-WikiEditor-reloadButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button, .ext-WikiEditor-reloadButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover { background-color: var(--wiki-content-background-color); } .editOptions { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-content-border-color); border-image: none; border-radius: 0 0 5px 5px; border-style: none solid solid; border-width: medium 1px 1px; } input#wpSummary { margin-bottom: 1em; margin-top: 1em; width: 80%; } .view-dark .ace_editor, .ace_editor { --ace-keywords: #CDA869; --ace-regexp: #E9C062; --ace-constants: #CF6A4C; --ace-illegal: #F8F8F8; --ace-deprecated: #D2A8A1; --ace-support: #9B859D; --ace-function: #DAD085; --ace-list: #F9EE98; --ace-variable: #7587A6; --ace-string: #8F9D6A; --ace-illegal-highlight: rgba(86, 45, 86, 0.75); --ace-step-highlight: #665200; --ace-multiselect-shadow: #141414; } .view-light .ace_editor { --ace-keywords: #00f; --ace-regexp: #036a07; --ace-constants: #c5060b; --ace-illegal: #f00; --ace-deprecated: #f00; --ace-support: #6d79de; --ace-function: #3c4c72; --ace-list: #b90690; --ace-variable: #318495; --ace-string: #036a07; --ace-illegal-highlight: rgba(255, 0, 0, 0.1); --ace-step-highlight: #fcff00; --ace-multiselect-shadow: #fff; } .ace_editor .ace_gutter { background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); } .ace_gutter-cell { color: color-mix(in srgb, var(--wiki-content-dynamic-color) 40%, transparent); } .ace_editor .ace_print-margin { width: 1px; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 75%, transparent); } .ace_editor { /* this image gradient hack effectively lets the element have 2 layers of background */ background-image: linear-gradient(var(--wiki-content-dynamic-color), var(--wiki-content-dynamic-color)); background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 93%, transparent); color: color-mix(in srgb, var(--wiki-content-dynamic-color) 93%, transparent); } .ace_editor .ace_cursor, .ace-monokai .ace_punctuation, .ace-monokai .ace_punctuation.ace_tag { color: var(--wiki-content-text-color); } .ace_editor .ace_marker-layer .ace_selection { background: color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent) } .ace_editor.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px var(--ace-multiselect-shadow); } .ace_editor .ace_marker-layer .ace_step { background: var(--ace-step-highlight); } .ace_editor .ace_marker-layer .ace_active-line, .ace_editor .ace_gutter-active-line { background: color-mix(in srgb, var(--wiki-content-dynamic-color) 3.1%, transparent) } .ace-tm .ace_marker-layer .ace_selected-word { background: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent); } .ace_editor .ace_marker-layer .ace_selection { background: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent); } .ace_editor .ace_marker-layer .ace_selected-word { border: 1px solid color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent); } .ace_editor .ace_invisible { color: color-mix(in srgb, var(--wiki-content-dynamic-color) 25%, transparent); } .ace_editor .ace_keyword, .ace_editor .ace_meta { color: var(--ace-keywords); } .ace_editor .ace_constant, .ace_editor .ace_constant.ace_numeric, .ace_editor .ace_constant.ace_character, .ace_editor .ace_constant.ace_character.ace_escape, .ace_editor .ace_constant.ace_other, .ace_editor .ace_heading, .ace_editor .ace_markup.ace_heading, .ace_editor .ace_support.ace_constant { color: var(--ace-constants); } .ace_editor .ace_invalid.ace_illegal { color: var(--ace-illegal); background-color: var(--ace-illegal-highlight); } .ace_editor .ace_invalid.ace_deprecated { text-decoration: underline; font-style: italic; color: var(--ace-deprecated); } .ace_editor .ace_support, .ace_editor .ace_support.ace_type { color: var(--ace-support); } .ace_editor .ace_fold { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent); border-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent); } .ace_editor .ace_support.ace_function { color: var(--ace-function); } .ace_editor .ace_list, .ace_editor .ace_markup.ace_list, .ace_editor .ace_storage { color: var(--ace-list); } .ace_editor .ace_entity.ace_name.ace_function, .ace_editor .ace_meta.ace_tag, .ace_editor .ace_variable { color: var(--ace-variable); } .ace_editor .ace_string { color: var(--ace-string); } .ace_editor .ace_string.ace_regexp { color: var(--ace-regexp); } .ace_editor .ace_comment { font-style: italic; color: color-mix(in srgb, var(--wiki-content-dynamic-color) 30%, transparent); } .ace_editor .ace_xml-pe { color: color-mix(in srgb, var(--wiki-content-dynamic-color) 28%, transparent); } .ace_editor .ace_indent-guide { background: none; box-shadow: 1px 0 0 color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent); } .ace_search { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border: 1px solid var(--wiki-content-border-color); } .ace_search_field { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-mix-color); } .ace_button { color: var(--wiki-content-text-color); border: 1px solid var(--wiki-content-border-color); } .ace_button:hover { background-color: var(--wiki-accent-color--hover); color: var(--wiki-accent-label-color); } .ace_button.checked { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .ace_searchbtn { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); border: 1px solid var(--wiki-content-border-color); } .ace_searchbtn:hover { background-color: var(--wiki-accent-color--hover); color: var(--wiki-accent-label-color); } .ace_searchbtn.prev::after, .ace_searchbtn.next::after { border-color: var(--wiki-accent-label-color); } .ace_searchbtn_close { filter: var(--wiki-icon-general-filter); } .wikiEditor-ui .codeEditor-status { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .mw-editform #wpTextbox1 { background: color-mix(in srgb, var(--wiki-content-background-color) 50%, transparent); color: var(--wiki-content-text-color); } .view-dark .ext-codemirror-wrapper, .ext-codemirror-wrapper { --codemirror-yellow: #ffd700; --codemirror-light-blue: #adf; --codemirror-blue: #08f; --codemirror-green: #290; --codemirror-red: #f50; --codemirror-dark-red: #dd1616; --codemirror-purple: #CD4EF9; --codemirror-pink: #e0e; --codemirror-light-gray: #eee; --codemirror-gray: #84a0a0; } .view-light .ext-codemirror-wrapper { --codemirror-yellow: #9e8500; --codemirror-light-blue: #008ae7; --codemirror-blue: #0085f9; --codemirror-green: #290; --codemirror-red: #ef4f00; --codemirror-dark-red: #a11; --codemirror-purple: #80c; --codemirror-pink: #ed00ed; --codemirror-light-gray: #858585; --codemirror-gray: #6b8a8a; } .ext-codemirror-wrapper { background-color: color-mix(in srgb, var(--wiki-content-background-color) 35%, transparent); color: var(--wiki-content-text-color) } .cm-editor .cm-selectionBackground, .cm-editor.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground { background: color-mix(in srgb, var(--wiki-accent-color) 30%, transparent); } .cm-mw-keyword { color: var(--codemirror-purple) } .cm-mw-def { color: var(--codemirror-blue) } .cm-mw-variable-2 { color: var(--codemirror-light-blue) } .cm-mw-string { color: var(--codemirror-red) } .cm-mw-atom { color: var(--codemirror-pink) } .cm-mw-number { color: var(--codemirror-green) } .cm-mw-matching { background-color: var(--codemirror-yellow) } .cm-mw-skipformatting { background-color: var(--codemirror-light-blue) } .cm-mw-list { color: var(--codemirror-blue) } .cm-mw-doubleUnderscore, .cm-mw-hr, .cm-mw-signature { background-color: var(--wiki-content-background-color--secondary); color: var(--codemirror-blue) } .cm-mw-indenting { color: var(--codemirror-blue) } .cm-mw-mnemonic { color: var(--codemirror-green) } .cm-mw-comment { color: var(--codemirror-gray) } .cm-mw-apostrophes-bold, .cm-mw-apostrophes-italic, .cm-mw-section-header { color: var(--codemirror-blue) } .cm-mw-template, .cm-mw-template-argument-name, .cm-mw-template-bracket, .cm-mw-template-delimiter, .cm-mw-template-name { color: var(--codemirror-purple); } .cm-mw-templatevariable, .cm-mw-templatevariable-bracket, .cm-mw-templatevariable-delimiter, .cm-mw-templatevariable-name { color: var(--codemirror-red) } .cm-mw-parserfunction-bracket, .cm-mw-parserfunction-delimiter, .cm-mw-parserfunction-name { color: var(--codemirror-dark-red) } .cm-mw-exttag-attribute, .cm-mw-exttag-bracket, .cm-mw-exttag-name, .cm-mw-htmltag-attribute, .cm-mw-htmltag-bracket, .cm-mw-htmltag-name { color: var(--codemirror-green) } .cm-mw-link, .cm-mw-link-pagename { color: var(--wiki-content-link-color) } .cm-mw-link-tosection { color: var(--codemirror-blue) } .cm-mw-extlink, .cm-mw-extlink-bracket, .cm-mw-extlink-protocol, .cm-mw-free-extlink, .cm-mw-free-extlink-protocol, .cm-mw-link-bracket, .cm-mw-link-delimiter { color: var(--wiki-content-link-color) } .cm-mw-table-bracket, .cm-mw-table-definition, .cm-mw-table-delimiter { color: var(--codemirror-pink) } .cm-mw-matchingbracket { background-color: var(--wiki-content-background-color--secondary); box-shadow: inset 0 0 1px 1px var(--wiki-content-link-color); font-weight: bold; } .cm-editor .cm-tooltip-autocomplete ul li[aria-selected] { background: color-mix(in srgb, var(--wiki-content-link-color) 15%, var(--wiki-content-background-color)); color: var(--wiki-content-link-color); } /* VisualEditor: Fix broken toolbar layout */ .oo-ui-toolbar { clear: none; display: flex; /* fix overflow issue at narrow widths */ } .ve-ui-toolbar > .oo-ui-toolbar-bar{ width: 100%; /* fix overflow issue at narrow widths */ } .ve-ui-toolbar.ve-ui-toolbar-floating > .oo-ui-toolbar-bar{ width: auto; /* fix overflow issue at narrow widths */ } .ve-init-mw-desktopArticleTarget-toolbar-open > .oo-ui-toolbar-bar > div:nth-child(4) { display: none; } .ve-ui-toolbar-floating > .oo-ui-toolbar-bar { top: var(--wikigg-header-scroll-height); } .oo-ui-toolbar-bar .oo-ui-toolbar-bar, .ve-area-wrapper .oo-ui-toolbar-bar { background-color: var(--wiki-content-background-color--secondary); } .ve-init-mw-desktopArticleTarget-originalContent .content-body { clear: right; } /* fix a lot of empty space from TemplateData when using VE Source */ .tdg-editscreen-main.mw-body-content::after { display: none; } /************* * End editor * **************/ /**************** * Tabber styles * *****************/ .tabber__header { box-shadow: inset 0 -1px 0 0 var(--wiki-content-border-color); } .tabber__tab, .tabber__tab:visited { color: var(--wiki-content-text-color); } .tabber__tab:hover, .tabber__tab:hover:visited, .tabber__tab[aria-selected="true"], .tabber__tab[aria-selected="true"]:visited { color: var(--wiki-content-link-color); } .tabber__tab[aria-selected="true"] { box-shadow: 0 -2px 0 var(--wiki-content-link-color) inset; } .tabber__header__prev::after, .tabber__header__next::after { filter: var(--wiki-icon-general-filter); } /******************** * End Tabber styles * *********************/ /*************************************** * Various fixes for multi-theme Vector * ****************************************/ :focus, :focus-visible { outline-color: var(--wiki-accent-color) } :focus-visible { outline-style: solid; } .oo-ui-iconElement-icon { filter: var(--wiki-icon-to-link-filter); } .oo-ui-iconElement-icon.oo-ui-icon-reload { filter: brightness(0) var(--wiki-icon-to-link-filter); } fieldset { border-color: var(--wiki-content-border-color); } hr { background-color: var(--wiki-content-border-color); } .CategoryTreeToggle { color: var(--wiki-content-link-color); } input, select { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } input:hover, input:focus, input:active { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-accent-color); box-shadow: none; } input:focus-visible { outline: 1px solid var(--wiki-accent-color); } input::file-selector-button, input[type="button"], input[type="submit"] { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .vector-body blockquote { border-color: var(--wiki-content-border-color); } /* category bar and filetoc */ .catlinks{ background: var(--wiki-content-catlinks-background, var(--wiki-content-background-color--secondary)); border-width: var(--wiki-content-catlinks-border-width, 1px); border-style: var(--wiki-content-catlinks-border-style, solid); border-color: var(--wiki-content-catlinks-border-color, var(--wiki-content-border-color)); border-radius: var(--wiki-content-catlinks-border-radius, 0px); border-image: var(--wiki-content-catlinks-border-image, none); box-shadow: var(--wiki-content-catlinks-box-shadow, none); } ul#filetoc { background: var(--wiki-content-filetoc-background, var(--wiki-content-background-color--secondary)); border-width: var(--wiki-content-filetoc-border-width, 1px); border-style: var(--wiki-content-filetoc-border-style, solid); border-color: var(--wiki-content-filetoc-border-color, var(--wiki-content-border-color)); border-radius: var(--wiki-content-filetoc-border-radius, 0px); border-image: var(--wiki-content-filetoc-border-image, none); box-shadow: var(--wiki-content-filetoc-box-shadow, none); } /**/ body .ui-dialog .ui-widget-header { /* we need an important here because the built-in styles have one :( */ background: var(--wiki-content-background-color) !important; border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .ui-widget-header .ui-dialog-titlebar-close .ui-icon-closethick { filter: var(--wiki-icon-general-filter); } .ui-widget-header .ui-dialog-titlebar-close.ui-state-hover { background: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } .ui-widget-content { background: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border: 1px solid var(--wiki-content-border-color); } body .ui-button { /* we need an important here because the built-in styles have one. Vector is a mess */ background: var(--wiki-accent-color) !important; border-color: var(--wiki-accent-color) !important; color: var(--wiki-accent-label-color); } body .ui-button:hover, body .ui-button:focus, body .ui-button:active { /* we need an important here because we had to use some above */ background: var(--wiki-accent-color--hover) !important; border-color: var(--wiki-accent-color--hover) !important; color: var(--wiki-accent-label-color); } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { color: var(--wiki-accent-label-color); } .ui-state-focus { /* we need an important here because the built-in styles have one */ background: var(--wiki-accent-color) !important; color: var(--wiki-accent-label-color) !important; } .ui-menu .ui-menu-item a { color: var(--wiki-content-dynamic-color); } #contentSub, #contentSub2 { color: var(--wiki-content-text-mix-color); } /* notifications ("your edit was saved", etc.) */ .mw-notification { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-content-border-color); top: var(--wikigg-header-scroll-height); } .mw-notification .oo-ui-labelElement-label { color: var(--wiki-content-text-color); } .mw-notification .oo-ui-iconElement-icon { filter: unset; } /**/ .mime-type.has-warning { color: var(--wiki-content-text-color); } .oo-ui-image-warning.oo-ui-icon-alert, .mw-ui-icon-alert-warning::before { filter: drop-shadow(0 0 3px #000); } .oo-ui-image-invert.oo-ui-icon-subtract, .mw-ui-icon-subtract-invert::before, .oo-ui-image-invert.oo-ui-icon-add, .mw-ui-icon-add-invert::before { filter: brightness(0) var(--wiki-icon-to-link-filter); filter: var(--wiki-icon-general-filter); } .mw_metadata td, .mw_metadata th { border-color: var(--wiki-content-border-color); } .mw_metadata th { background-color: var(--wiki-content-background-color--secondary); } .mw_metadata td { background-color: var(--wiki-content-background-color); } .mw-datatable td, .mw-datatable th { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } #mw-allmessagestable tbody:hover td, .mw-datatable tr:hover > td { background-color: var(--wiki-content-background-color--secondary); } #mw-allmessagestable .am_default { background-color: color-mix(in srgb, var(--wiki-accent-color) 80%, transparent); color: var(--wiki-accent-label-color); } #mw-allmessagestable .am_actual, #mw-allmessagestable tbody:hover .am_default { background-color: color-mix(in srgb, var(--wiki-accent-color) 60%, transparent); } #mw-allmessagestable .am_actual { color: var(--wiki-accent-label-color); } #mw-allmessagestable tbody:hover .am_actual { background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .mw-datatable, .mw-json { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); color: inherit; } .mw-datatable > * > tr > th, .mw-datatable > tr > th, .mw-json > * > tr > th, .mw-json > tr > th { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); padding-bottom: 9px; padding-top: 9px; } .mw-datatable > * > tr > td, .mw-datatable > tr > td, .mw-json > * > tr > td, .mw-json > tr > td { border-color: var(--wiki-content-border-color); } .mw-json tr { background-color: inherit; } .mw-json .mw-json-single-value, .mw-json .mw-json-value, .mw-json .value { background: color-mix(in srgb, var(--wiki-success-color) 60%, transparent); } .mw-json .mw-json-empty { background: var(--wiki-content-background-color--secondary); } .mw-message-box, .mw-message-box-warning { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); } .mw-message-box-warning { border-color: var(--wiki-warning-color); border-width: 1px 1px 1px 10px; } .mw-destfile-warning { border-color: var(--wiki-warning-color); color: var(--wiki-content-text-color); background-color: color-mix(in srgb, var(--wiki-warning-color) 25%, transparent); } .wikitable *, .wikitable :after, .wikitable :before { -webkit-box-sizing: inherit; box-sizing: inherit; } .cargo-pagevalues-tableinfo { background-color: var(--wiki-content-background-color); border-bottom: 1px solid var(--wiki-content-border-color); top: 46px; position: static; /* override sticky in the built-in */ } .cargo-table-diagram .cargo-table-svg .node.entity-name rect { fill: var(--wiki-content-background-color--secondary); fill-opacity: 1; } .cargo-table-diagram .cargo-table-svg .node rect { stroke: var(--wiki-content-border-color); opacity: 1; } .cargo-table-diagram .cargo-table-svg .node text tspan { fill: var(--wiki-content-text-color); } table.cargoTable { color: var(--wiki-content-text-color); } table.cargoTable tbody td, table.cargoTable thead th { border: 1px solid var(--wiki-content-border-color); } table.cargoTable tr:hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 25%, transparent); } table.cargoTable thead tr:nth-child(odd), table.cargoTable.noMerge thead tr:nth-child(odd) { background-color: var(--wiki-accent-color); } table.cargoTable tbody tr:nth-child(2n), table.cargoTable.noMerge tbody tr:nth-child(2n) { background-color: var(--wiki-content-background-color); } table.cargoTable tbody tr:nth-child(odd), table.cargoTable.noMerge tbody tr:nth-child(odd) { background-color: var(--wiki-content-background-color--secondary); } table.cargoTable th.headerSort { color: var(--wiki-accent-label-color); } table.cargoTable th.headerSort:hover { color: var(--wiki-accent-label-color); text-decoration: underline; } table.cargoTable th.headerSort::after { background-color: var(--wiki-accent-link-color); } #mw-content-text div.cargoReplacementTableInfo { background: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } .dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_processing, .dataTables_wrapper .dataTables_paginate { color: var(--wiki-content-text-color); } table.dataTable tbody tr { background-color: var(--wiki-content-background-color); } table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 75%, transparent); } table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd, table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent); } table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { background-color: color-mix(in srgb, var(--wiki-content-background-color) 75%, transparent); } table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { background-color: var(--wiki-content-background-color--secondary); } .dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { /* we need this !important to override a built-in one */ color: var(--wiki-content-text-mix-color) !important; } table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { border-top: 1px solid var(--wiki-content-border-color); } .dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { /* we need this !important to override a built-in one */ color: var(--wiki-content-text-mix-color) !important; border: 1px solid var(--wiki-content-border-color); background-color: var(--wiki-content-background-color); background: linear-gradient(to bottom, var(--wiki-content-background-color) 0%, var(--wiki-content-background-color--secondary) 100%); } div.drilldown-filters-wrapper { background-color: transparent; border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .action-pagevalues tr:nth-of-type(2n) { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent); } .action-pagevalues tr:hover { background-image: linear-gradient(color-mix(in srgb, var(--wiki-accent-color) 20%, transparent), color-mix(in srgb, var(--wiki-accent-color) 20%, transparent)); } div.specialCargoQuery-extraPane { background: var(--wiki-content-background-color); } .oo-ui-panelLayout-framed { border-color: var(--wiki-content-border-color); } .oo-ui-inputWidget-input + .oo-ui-image-invert.oo-ui-icon-check { background-image: none; } .oo-ui-inputWidget-input:checked + .oo-ui-image-invert.oo-ui-icon-check::before { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background-image: url(/load.php?modules=oojs-ui-core.icons&image=check&variant=invert&format=rasterized&skin=vector&version=y9f1k); background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E check %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M7 14.2 2.8 10l-1.4 1.4L7 17 19 5l-1.4-1.4z%22/%3E%3C/g%3E%3C/svg%3E"); content: ''; pointer-events: none; filter: var(--wiki-icon-general-filter); } .oo-ui-checkboxInputWidget [type="checkbox"] + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span { filter: unset; background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); border-color: color-mix(in srgb, var(--wiki-accent-color) 75%, transparent); } .oo-ui-checkboxInputWidget [type="checkbox"]:disabled + span { background-color: var(--wiki-content-text-mix-color); border-color: var(--wiki-content-text-mix-color); } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:hover + span { border-color: var(--wiki-accent-color); filter: unset; } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span { background-color: var(--wiki-accent-color); } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:focus + span { box-shadow: none; } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:focus + span { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); outline: 1px solid transparent; } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:hover + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:focus + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:hover + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:active + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:checked:focus + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:hover + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:active + span, .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:indeterminate:focus + span { background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); border-color: var(--wiki-accent-color); } .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type="checkbox"]:active + span { background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent) } .oo-ui-image-invert.oo-ui-icon-check { background: none; position: relative; } .oo-ui-inputWidget-input:checked + .oo-ui-image-invert.oo-ui-icon-check::before { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background-image: url(/load.php?modules=oojs-ui-core.icons&image=check&variant=invert&format=rasterized&skin=vector&version=y9f1k); background-image: linear-gradient(transparent, transparent), url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E check %3C/title%3E%3Cg fill=%22%23fff%22%3E%3Cpath d=%22M7 14.2 2.8 10l-1.4 1.4L7 17 19 5l-1.4-1.4z%22/%3E%3C/g%3E%3C/svg%3E"); content: ''; pointer-events: none; filter: var(--wiki-icon-general-filter); } .oo-ui-indicatorElement-indicator { filter: var(--wiki-icon-to-link-filter); } .oo-ui-tagItemWidget.oo-ui-widget-enabled:not(.oo-ui-tagItemWidget-fixed) { background-color: var(--wiki-content-background-color--secondary); } .oo-ui-tagItemWidget.oo-ui-widget-enabled:hover { color: var(--wiki-content-text-color--hover); } .oo-ui-tagItemWidget.oo-ui-widget-enabled:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-tagItemWidget.oo-ui-widget-disabled { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-mix-color); border-color: var(--wiki-content-text-mix-color); } .client-js .mw-recentchanges-toplinks:not(.mw-recentchanges-toplinks-collapsed) { border-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-savedLinksListWidget-placeholder.oo-ui-optionWidget .oo-ui-labelElement-label { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-savedLinksListWidget-menu .mw-rcfilters-ui-savedLinksListItemWidget { color: var(--wiki-content-text-color); padding: 8px 6px; -webkit-transition: color .3s, background-color .3s; transition: color .3s, background-color .3s; } .mw-rcfilters-ui-savedLinksListWidget-menu .mw-rcfilters-ui-savedLinksListItemWidget:hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); color: var(--wiki-accent-color); } .mw-rcfilters-ui-savedLinksListItemWidget-label { color: var(--wiki-accent-color); } .mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined { background-color: transparent; } .mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle { border-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle + .mw-rcfilters-ui-table, .mw-rcfilters-ui-filterTagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle.mw-rcfilters-ui-filterTagMultiselectWidget-emphasize { background-color: var(--wiki-content-background-color--secondary); } .mw-rcfilters-ui-filterTagMultiselectWidget-views-select-widget.oo-ui-widget { border-color: var(--wiki-content-border-color); padding: 0; } .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-savedQueryTitle { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button > .oo-ui-labelElement-label { color: var(--wiki-content-link-color); } .mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button > .oo-ui-labelElement-label:hover { color: var(--wiki-content-link-color--hover); } .mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button:before { content: "["; } .mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton .oo-ui-buttonElement-button:after { content: "]"; } .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button { color: var(--wiki-content-text-color); } .oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:hover { background-color: var(--wiki-content-dynamic-color--inverted); } .mw-rcfilters-ui-filterTagMultiselectWidget-emptyFilters { color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent); } .mw-rcfilters-ui-filterMenuSectionOptionWidget { background-color: var(--wiki-content-background-color); } .oo-ui-menuSelectWidget { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-text-mix-color); } .mw-rcfilters-ui-filterMenuSectionOptionWidget-header-title.oo-ui-labelElement-label { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-filterMenuHeaderWidget-header { background-color: var(--wiki-content-background-color); border-bottom-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-filterMenuHeaderWidget-title { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-itemMenuOptionWidget:not(:last-child):not(.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk) { border-bottom-color: var(--wiki-content-text-mix-color); } .mw-rcfilters-ui-itemMenuOptionWidget-view-namespaces { border-top-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected, .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-title, .mw-rcfilters-ui-itemMenuOptionWidget:hover, .mw-rcfilters-ui-itemMenuOptionWidget:hover .mw-rcfilters-ui-itemMenuOptionWidget-label-title { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span, .mw-rcfilters-ui-itemMenuOptionWidget:hover .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span { border-color: var(--wiki-accent-color); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected, .mw-rcfilters-ui-itemMenuOptionWidget:hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent) } .mw-rcfilters-ui-itemMenuOptionWidget-excludeLabel, .mw-rcfilters-ui-itemMenuOptionWidget-label-title { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-itemMenuOptionWidget-label-desc { color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected:hover, .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected):hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-title, .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .mw-rcfilters-ui-itemMenuOptionWidget-label-title { color: var(--wiki-content-text-color); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-desc { color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-optionWidget-selected .mw-rcfilters-ui-itemMenuOptionWidget-label-desc, .mw-rcfilters-ui-itemMenuOptionWidget:hover .mw-rcfilters-ui-itemMenuOptionWidget-label-desc, .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .mw-rcfilters-ui-itemMenuOptionWidget-label-desc { color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent); } .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted.oo-ui-optionWidget-selected .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span, .mw-rcfilters-ui-itemMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type=checkbox] + span { border-color: var(--wiki-content-text-color); } .mw-rcfilters-ui-viewSwitchWidget label.oo-ui-labelWidget { color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent); } .oo-ui-tagItemWidget.oo-ui-widget-enabled, .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled { background-color: transparent; color: var(--wiki-content-text-color); border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled.selected { background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent); border-color: var(--wiki-accent-color); } .mw-rcfilters-ui-datePopupWidget { border-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-datePopupWidget .mw-rcfilters-ui-valuePickerWidget-title { color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent); } .mw-changeslist-legend, .mw-rcfilters-ui-changesListWrapperWidget .mw-changeslist-legend { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } @keyframes fadeBlue { 60% { border-top-color: var(--wiki-accent-color); } 100% { border-top-color: var(--wiki-content-border-color); } } .mw-rcfilters-ui-changesListWrapperWidget-previousChangesIndicator { border-top-color: var(--wiki-content-border-color); } .mw-rcfilters-ui-menuSelectWidget-footer { background-color: var(--wiki-content-text-mix-color-95); } .mw-rcfilters-ui-filterMenuOptionWidget.oo-ui-flaggedElement-muted:not(.oo-ui-optionWidget-selected) { background-color: color-mix(in srgb, var(--wiki-content-text-color) 10%, transparent); } .oo-ui-iconElement-icon.mw-rcfilters-ui-filterItemHighlightButton-circle { filter: unset; } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .mw-rcfilters-ui-tagItemWidget-selected.oo-ui-tagItemWidget.oo-ui-widget-enabled { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); border-color: var(--wiki-accent-color); } .mw-rcfilters-ui-tagItemWidget.oo-ui-flaggedElement-muted.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-labelElement-label { color: color-mix(in srgb, var(--wiki-content-text-color) 76%, transparent); } .mw-rcfilters-ui-tagItemWidget-popup-content { color: color-mix(in srgb, var(--wiki-content-text-color) 75%, transparent); } /* fix for weird focus box on recentchanges arrows when clicking, but keep it for tab navigation */ .mw-enhancedchanges-checkbox:focus + * .mw-enhancedchanges-arrow { outline: none; } .mw-enhancedchanges-checkbox:focus-visible + * .mw-enhancedchanges-arrow { outline: 1px solid var(--wiki-accent-color); } /**/ .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before { border-top-color: var(--wiki-content-border-color); } .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after { border-top-color: var(--wiki-content-background-color--secondary); } .unpatrolled { color: var(--wiki-alert-color); } .autocomment, .autocomment a, .autocomment a:visited { color: var(--wiki-content-text-mix-color); } /* Recent changes filter highlighting */ .view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c1, .view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c1 tr:first-child, .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c1.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)), .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c1.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) { background-color: #1c283f; } .view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c2, .view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c2 tr:first-child, .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c2.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)), .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c2.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) { background-color: #0f3128; } .view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c3, .view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c3 tr:first-child, .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c3.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)), .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c3.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) { background-color: #352c10; } .view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c4, .view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c4 tr:first-child, .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c4.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)), .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c4.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) { background-color: #411d0c; } .view-dark .mw-rcfilters-ui-changesListWrapperWidget li.mw-rcfilters-highlight-color-c5, .view-dark .mw-rcfilters-ui-changesListWrapperWidget .mw-rcfilters-highlight-color-c5 tr:first-child, .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c5.mw-rcfilters-ui-highlights-enhanced-toplevel:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+2)), .view-dark .mw-rcfilters-ui-changesListWrapperWidget tr.mw-rcfilters-highlight-color-c5.mw-rcfilters-ui-highlights-enhanced-nested:not(.mw-rcfilters-ui-changesListWrapperWidget-enhanced-grey) td:not(:nth-child(-n+4)) { background-color: #3f0f0f; } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled, .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined { background-color: transparent; } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); -webkit-transition: border-color 300ms, box-shadow 300ms; transition: border-color 300ms, box-shadow 300ms; background-color: var(--wiki-content-background-color--secondary) } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-tagMultiselectWidget-focus .oo-ui-tagMultiselectWidget-handle { box-shadow: inset 0 0 0 1px var(--wiki-accent-color); border-color: var(--wiki-accent-color); outline: 0 } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined:hover .oo-ui-tagMultiselectWidget-handle { border-color: var(--wiki-accent-color) } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-flaggedElement-invalid .oo-ui-tagMultiselectWidget-handle, .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-flaggedElement-invalid:hover .oo-ui-tagMultiselectWidget-handle { border-color: var(--wiki-alert-color) } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle { background-color: var(--wiki-content-background-color--secondary); border-bottom-width: 0; border-bottom-left-radius: 0; border-bottom-right-radius: 0 } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-inputWidget-input { border-radius: 0; } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input { border-color: var(--wiki-alert-color); } .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input { color: var(--wiki-alert-color); } .oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle { opacity: 0.5; } .oo-ui-tagMultiselectWidget-handle .oo-ui-tagMultiselectWidget-group > input { color: var(--wiki-content-text-color); } .oo-ui-tagMultiselectWidget .oo-ui-inputWidget-input { color: inherit; background: transparent; font-family: inherit; } .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle, .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input, .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle { background: var(--wiki-content-text-mix-color-95); color: color-mix(in srgb, var(--wiki-content-text-color) 25%, transparent); text-shadow: none; border-color: var(--wiki-content-text-mix-color); } .oo-ui-textInputWidget.oo-ui-widget-enabled .oo-ui-inputWidget-input::placeholder { color: var(--wiki-content-text-mix-color); } .oo-ui-dropdownInputWidget select { border-color: var(--wiki-content-border-color); } .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-toggleSwitchWidget { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, var(--wiki-content-dynamic-color)); border-color: color-mix(in srgb, var(--wiki-content-border-color) 95%, var(--wiki-content-dynamic-color)); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip { background-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); border-color: #0006; } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip { background-color: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-content-dynamic-color)); border-color: #0006; } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip { background-color: var(--wiki-accent-label-color); border-color: #0006; } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus .oo-ui-toggleSwitchWidget-grip { border-color: var(--wiki-accent-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:hover { background-color: var(--wiki-accent-color--hover); border-color: var(--wiki-accent-color--hover); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active, .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover, .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:focus { background-color: var(--wiki-accent-color--hover); border-color: var(--wiki-accent-color--hover); box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip, .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip, .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:focus .oo-ui-toggleSwitchWidget-grip { background-color: var(--wiki-accent-label-color); border-color: var(--wiki-accent-label-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active, .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:active:hover { background-color: var(--wiki-accent-color--hover); border-color: var(--wiki-accent-color--hover); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus { border-color: var(--wiki-accent-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on:focus::before { border-color: var(--wiki-accent-label-color); } .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled { background-color: var(--wiki-content-text-mix-color-95); border-color: var(--wiki-content-text-mix-color-95); } .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip { border-color: var(--wiki-content-dynamic-color--inverted); box-shadow: inset 0 0 0 1px var(--wiki-content-dynamic-color--inverted); } .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected, .oo-ui-outlineOptionWidget.oo-ui-optionWidget-highlighted { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-link-color); } .oo-ui-labelWidget.oo-ui-inline-help { color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent); } .oo-ui-progressBarWidget:not(.oo-ui-pendingElement-pending) { background-color: var(--wiki-content-background-color); border-color: var(--wiki-accent-color); box-shadow: 0 1px 1px color-mix(in srgb, var(--wiki-content-dynamic-color) 15%, transparent); } .oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar { background-color: var(--wiki-accent-color); } .oo-ui-bookletLayout-outlinePanel { padding: 7px 0; } .oo-ui-processDialog-content .oo-ui-window-head, .oo-ui-processDialog-content .oo-ui-window-foot, .oo-ui-messageDialog-content > .oo-ui-window-head, .oo-ui-messageDialog-content > .oo-ui-window-foot { outline-color: var(--wiki-content-border-color); } .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget { border-right-color: var(--wiki-content-border-color); } .oo-ui-messageDialog-title { color: var(--wiki-content-heading-color); } .oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button:hover { background-color: var(--wiki-content-background-color); border-right-color: var(--wiki-content-border-color); } .oo-ui-processDialog-errors { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 90%, transparent); } /* OAuth authorisation dialog */ #mw-mwoauth-authorize-form { color: inherit; } .oo-ui-toolbar-bar, .oo-ui-popupToolGroup-tools, .oo-ui-listToolGroup-tools .oo-ui-tool.oo-ui-widget-enabled:hover { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); } .oo-ui-popupToolGroup-tools { max-width: 100%; } .oo-ui-toolbar-actions .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover { border-right-color: var(--wiki-content-border-color); } .oo-ui-menuToolGroup-tools .oo-ui-tool.oo-ui-tool-active, .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:active, .oo-ui-tool.oo-ui-widget-enabled.oo-ui-tool-active > .oo-ui-tool-link, .oo-ui-tool.oo-ui-widget-enabled.oo-ui-popupToolGroup-active > .oo-ui-tool-link, .oo-ui-popupToolGroup.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle { background-color: var(--wiki-content-background-color); color: var(--wiki-content-link-color); } .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link { /* we remove the transition here because it causes the hard-coded color to flash briefly */ transition: none; } .oo-ui-popupToolGroup.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle:hover { color: var(--wiki-accent-color); } .oo-ui-popupToolGroup-tools .oo-ui-tool-active.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title { color: var(--wiki-accent-color); } .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover, .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:hover { background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent); } .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active { background-color: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent); } .oo-ui-popupToolGroup-tools .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link:focus { box-shadow: inset 0 0 0 2px var(--wiki-accent-color); } .oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:focus, .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link:focus, .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link:focus { outline: 1px solid var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-menuToolGroup, .oo-ui-popupToolGroup-tools { border-color: var(--wiki-content-border-color); } .oo-ui-toolbar-position-top > .oo-ui-toolbar-bar { border-color: var(--wiki-content-border-color); box-shadow: 0 1px 1px 0 color-mix(in srgb, var(--wiki-content-dynamic-color) 10%, transparent); } .oo-ui-barToolGroup-tools.oo-ui-toolGroup-enabled-tools .oo-ui-tool.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-tool-link, .oo-ui-barToolGroup-tools.oo-ui-toolGroup-disabled-tools .oo-ui-tool.oo-ui-flaggedElement-primary > .oo-ui-tool-link { background-color: var(--wiki-content-text-mix-color); border-color: var(--wiki-content-text-mix-color); } .oo-ui-tool.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-tool-link { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .oo-ui-tool.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-tool-link:hover { background-color: var(--wiki-accent-color--hover); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button, .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button { color: var(--wiki-content-text-color); } .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus { color: var(--wiki-content-text-color--hover); } .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button { color: var(--wiki-content-text-color); } .oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus { color: var(--wiki-content-text-color--hover); } .oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button { color: var(--wiki-alert-color); } .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button { border: 1px solid transparent; } .oo-ui-buttonElement-frameless > button.oo-ui-buttonElement-button { color: inherit; } .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color), inset 0 0 0 2px var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active { background-color: var(--wiki-accent-color--hover); border-color: var(--wiki-accent-color--hover); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button { background-color: #bf0017; border-color: #bf0017; color: #fff; } .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active { background-color: #59000b; border-color: #59000b; } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus { box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover), inset 0 0 0 2px var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color--hover); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-link-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button { color: var(--wiki-accent-color); } .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button, .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active { background-color: color-mix(in srgb, var(--wiki-content-link-color) 8%, transparent); color: var(--wiki-content-text-color); border-color: var(--wiki-content-text-mix-color); } .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button { color: color-mix(in srgb, var(--wiki-content-link-color) 90%, transparent); border-color: color-mix(in srgb, var(--wiki-content-link-color) 90%, transparent); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover { background-color: transparent; } .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover { background-color: var(--wiki-content-dynamic-color--inverted); } .oo-ui-buttonSelectWidget.oo-ui-widget-enabled:focus .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected .oo-ui-buttonElement-button { border-color: var(--wiki-accent-color--hover); box-shadow: inset 0 0 0 1px var(--wiki-accent-color--hover), inset 0 0 0 2px var(--wiki-accent-label-color); } .mw-htmlform-ooui .mw-htmlform-matrix tbody tr:nth-child(2n) td, .mw-htmlform-ooui .mw-htmlform-matrix tbody tr:hover td { background-color: var(--wiki-content-background-color--secondary); } .oo-ui-popupWidget-popup { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-advancedSearch-namespace-selection { background: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); } .oo-ui-popupWidget-popup .mw-advancedSearch-tooltip-head { color: var(--wiki-content-text-mix-color); } .oo-ui-menuSectionOptionWidget { color: var(--wiki-content-text-mix-color); } /* possibly deprecated */ .mw-ui-button:not(:disabled) { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); color: var(--wiki-accent-color); border-color: var(--wiki-content-border-color); } .mw-ui-button:not(:disabled):visited { color: var(--wiki-accent-color); } .mw-ui-button:not(:disabled):hover { background-color: var(--wiki-content-text-mix-color-95); border-color: var(--wiki-content-border-color); color: var(--wiki-accent-color--hover); } .mw-ui-button:not(:disabled):focus { border-color: var(--wiki-accent-color); color: var(--wiki-content-text-color); box-shadow: none; } .mw-ui-button:not(:disabled):active, .mw-ui-button:not(:disabled).is-on { background-color: var(--wiki-content-background-color); color: var(--wiki-content-dynamic-color); border-color: var(--wiki-content-link-color); } /* end possibly deprecated */ .mw-ui-icon-before::before { filter: var(--wiki-icon-to-link-filter); } .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame { background-color: var(--wiki-content-background-color); color: var(--wiki-content-text-color); border-color: var(--wiki-content-border-color); } .oo-ui-windowManager-modal > .oo-ui-dialog { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 50%, transparent); } .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame { border-color: var(--wiki-content-border-color); } .oo-ui-messageDialog-message { color: var(--wiki-content-text-color); } .oo-ui-buttonElement-framed:not(.oo-ui-flaggedElement-primary):not(.oo-ui-buttonElement-active) > .oo-ui-buttonElement-button { color: var(--wiki-content-text-color); } .oo-ui-buttonElement-framed.oo-ui-widget-disabled:not(.oo-ui-flaggedElement-primary):not(.oo-ui-buttonElement-active) > .oo-ui-buttonElement-button { color: var(--wiki-content-text-mix-color-95); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button { color: var(--wiki-accent-color); border-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover { color: var(--wiki-accent-color--hover); border-color: var(--wiki-accent-color); box-shadow: inset 0 0 3px var(--wiki-accent-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active, .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-link-color--hover); border-color: var(--wiki-content-link-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button, .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button { background-color: var(--wiki-content-text-mix-color); border-color: var(--wiki-content-text-mix-color); } .tdg-templateDataParamWidget-param-description { color: var(--wiki-content-text-mix-color); } .oo-ui-messageWidget.oo-ui-flaggedElement-error:not(.oo-ui-messageWidget-block), .mw-body-content .error { color: var(--wiki-alert-color); } .oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-error { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-alert-color); border-left-width: 10px; } .oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-warning { background-color: var(--wiki-content-background-color--secondary); } .oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-success { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-success-color); border-left-width: 10px; } .oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-notice { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-text-mix-color); } .tdg-templateDataParamWidget-param-alias { color: var(--wiki-content-text-mix-color); background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } .tdg-templateDataParamWidget-param-alias:first-child { background-color: var(--wiki-content-background-color--secondary); } .mw-templatedata-doc-muted { color: var(--wiki-content-text-mix-color); } .oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button:active { background-color: var(--wiki-content-background-color--secondary); border-right-color: var(--wiki-accent-color); } /* Date picker */ .mw-widget-dateInputWidget-handle { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle:hover { border-color: var(--wiki-accent-color); box-shadow: none; } .mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .mw-widget-dateInputWidget.oo-ui-widget-enabled .mw-widget-dateInputWidget-handle > .oo-ui-labelElement-label { color: var(--wiki-content-text-color); } .mw-widget-calendarWidget { border-color: var(--wiki-content-border-color); } .mw-widget-calendarWidget:focus { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .mw-widget-dateInputWidget-calendar { background-color: var(--wiki-content-background-color); } .mw-widget-dateInputWidget-calendar:focus { box-shadow: inset 0 0 0 1px var(--wiki-accent-color), 0 2px 2px 0 rgba(0, 0, 0, 0.2); } .mw-widget-calendarWidget-header .oo-ui-labelElement-label, .mw-widget-calendarWidget-day, .mw-widget-calendarWidget-month, .mw-widget-calendarWidget-year { color: var(--wiki-content-text-color); } .mw-widget-calendarWidget-day-heading, .mw-widget-calendarWidget-day-additional { color: color-mix(in srgb, var(--wiki-content-text-color) 55%, transparent); } .mw-widget-calendarWidget-day-today { box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .mw-widget-calendarWidget-item-selected { background-color: color-mix(in srgb, var(--wiki-accent-color) 90%, transparent); color: var(--wiki-accent-label-color); } .mw-widget-calendarWidget-item:hover { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .mw-widgets-datetime-calendarWidget:focus { border-color: var(--wiki-content-border-color); box-shadow: none; } .mw-widgets-datetime-calendarWidget-grid { overflow-x: initial; } .mw-widgets-datetime-dateTimeInputWidget-handle { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-widgets-datetime-dateTimeInputWidget.oo-ui-widget-enabled .mw-widgets-datetime-dateTimeInputWidget-handle:hover { border-color: var(--wiki-content-border-color); } .mw-widgets-datetime-dateTimeInputWidget.oo-ui-widget-enabled .mw-widgets-datetime-dateTimeInputWidget-editField:hover { background-color: var(--wiki-content-background-color); } .mw-widgets-datetime-calendarWidget { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } .mw-widgets-datetime-calendarWidget-grid .mw-widgets-datetime-calendarWidget-cell.mw-widgets-datetime-calendarWidget-extra .oo-ui-buttonElement-button .oo-ui-labelElement-label { color: color-mix(in srgb, var(--wiki-content-text-color) 55%, transparent); } /* Unpatrolled page creations on Special:NewPages */ .not-patrolled { background-color: color-mix(in srgb, var(--wiki-warning-color) 16%, transparent); } .mw-spinner-container > div::after { background-color: var(--wiki-content-text-color); } pre, code, .mw-code { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-templatedata-doc-param-alias { color: var(--wiki-content-text-mix-color); } .mw-highlight{ overflow: unset !important; } .mw-highlight pre{ overflow: auto; } div.mw-highlight, .skin-theme-clientpref-night div.mw-highlight { background-color: var(--wiki-content-dynamic-color--inverted); margin: 0.5em 0; } .mw-highlight pre { background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent); margin: 0; } .mw-content-ltr.mw-highlight-lines pre, .mw-content-ltr.content .mw-highlight-lines pre { padding-left: 3.5em; box-shadow: inset 2.75em 0 0 var(--wiki-content-dynamic-color--inverted); } .mw-highlight .hll { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent) } .mw-apisandbox-toolbar { background: var(--wiki-content-background-color--secondary); top: var(--wikigg-header-scroll-height); } /* special:replacetext */ .ext-replacetext-searchoptions { background-color: transparent; border: 1px solid var(--wiki-content-border-color); } .ext-replacetext-searchoptions .ext-replacetext-divider { border-bottom: 1px solid var(--wiki-content-border-color); } /**/ .view-dark textarea { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .view-dark textarea:focus-visible { outline-color: var(--wiki-accent-color); outline-style: solid; } .oo-ui-textInputWidget.oo-ui-widget-enabled textarea.oo-ui-inputWidget-input:focus { outline: 1px solid var(--wiki-accent-color); } /* make math formulas legible on dark theme */ .mwe-math-fallback-image-inline, .mwe-math-fallback-image-display, .ve-ui-mwLatexPage-symbol { filter: var(--wiki-icon-general-filter); } /* search bar */ #searchInput { font-size: inherit; /* override UA style */ background-color: var(--wiki-navigation-search-background-color, var(--wiki-content-background-color--secondary)); background-image: var(--wiki-navigation-search-background-image, none); background-position: var(--wiki-navigation-search-background-position, 0); background-size: var(--wiki-navigation-search-background-size, auto); background-repeat: var(--wiki-navigation-search-background-repeat, repeat); border: var(--wiki-navigation-search-border-width, 1px) var(--wiki-navigation-search-border-style, solid) var(--wiki-navigation-search-border-color, var(--wiki-content-border-color)); border-radius: var(--wiki-navigation-search-border-radius, 2px); color: var(--wiki-navigation-search-text-color, var(--wiki-content-text-color)); backdrop-filter: var(--wiki-navigation-search-backdrop-filter, none); box-shadow: var(--wiki-navigation-search-box-shadow, none); border-image: var(--wiki-navigation-search-border-image, none); } #searchInput:focus, #searchform:hover #searchInput, #searchform:hover #searchInput:focus { border-color: var(--wiki-navigation-search-border-color--hover, var(--wiki-accent-color)); box-shadow: var(--wiki-navigation-search-box-shadow--hover, var(--wiki-navigation-search-box-shadow, none)); border-image: var(--wiki-navigation-search-border-image--hover, var(--wiki-navigation-search-border-image, none)); } #searchButton { filter: var(--wiki-icon-to-link-filter); } .vector-search-box-input::placeholder { color: var(--wiki-content-text-mix-color); } /* Search suggestions */ .suggestions-results, .suggestions-special { background-color: var(--wiki-content-background-color--secondary); } .suggestions a.mw-searchSuggest-link, .suggestions a.mw-searchSuggest-link:hover, .suggestions a.mw-searchSuggest-link:active, .suggestions a.mw-searchSuggest-link:focus { color: var(--wiki-content-text-color); } .suggestions-result { color: var(--wiki-content-link-color); } .suggestions-result-current { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .suggestions-special .special-label { color: var(--wiki-content-text-mix-color); } .suggestions-special .special-query { color: var(--wiki-content-text-color); } .suggestions-special.suggestions-result-current .special-label, .suggestions-special.suggestions-result-current .special-query { color: var(--wiki-accent-label-color); } /* search page */ fieldset#mw-searchoptions { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent); border-color: var(--wiki-content-border-color); } #mw-searchoptions .divider { border-color: var(--wiki-content-border-color); } .mw-search-profile-tabs { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 50%, transparent); border: 1px solid var(--wiki-content-border-color); margin-top: 1em; } .mw-search-profile-tabs div.search-types ul li.current a { color: var(--wiki-content-text-color); } .results-info, .mw-search-result-data { color: var(--wiki-content-text-mix-color); } /**/ /* Login/register page */ .mw-number-text { color: var(--wiki-content-text-mix-color); } .mw-body-content .mw-number-text h3 { color: var(--wiki-content-heading-color); } .mw-number-text.icon-edits, .mw-number-text.icon-pages, .mw-number-text.icon-contributors { position: relative; background: none; } .mw-number-text.icon-edits::before, .mw-number-text.icon-pages::before, .mw-number-text.icon-contributors::before { position: absolute; width: 95px; height: 100%; left: 0; top: 0; content: ''; filter: brightness(0) var(--wiki-icon-general-filter); } .mw-number-text.icon-edits::before { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABLCAYAAADnAAD1AAACrUlEQVR4AWL4//8/oH170LEsiKIwXGPbtm0EY9s2g7bdjzh4oVnjyslKVZ3hSu+d5L/c0Xdx/Bt5jjCyAR3QAd9/+DhSW4oeoYmJGQdM4HWjYfQKTXTA8pZFeIgjOmA5Hkd0wDwe6TWa6IAcr4eA5RAdEC0neKWIDoieFcMRRPOAaDJ6+4uITxzwJ+KbmnjdaKkDliISPIv/gcvRxsT7kzgix7MGuBz1ooFyRIq3xOJ64ArUG0EMoMV5RI5nAJDjRV1Go1DIIL7meJKAAngc8Qn/tgoACuCNRtfRJhQyGQLkeJcI3u3oP3GzA5bjjYnwEEE0Acjx+urgEcRNVgFX1sUjdaHF9gA53sW/jScFKIC3SH8hIo5nDXAVwbtA8O6U4+kD6uPpA2rhWQNcXYh3N4HXSfAMAHK8838BTwBQF28hCpKAAnj3SvCsAa4heOdU8NQB5fGUAfXxhAEZ3lmCdz+B18Hx9ABN46kBrv1DeAtQsAZYivdAB08AMMLrJ3hBHU8BkOGdqcyMLcCbj4I1QH08YUCGd0kbTwCQ4MW1oFkR3kM5PAHAdVU8gjhPEk8AkOKRBjN481AwAxjhDRCM4Rq1EzwTgAzvGtoqiicAmMcbjRZI4wkATiP/eVe/4QU0DvXJ4gkAHq9gNEV4cdPRRtQjgycAOA51VkAOoECaiF5J4QkA7iVnuI+vgTcXBauAo1BjBeU0mZuCXlfm2gieOcCN5KzPadH7s9EF1CeJJwD4lKy2BLQM3UFDaFgSTwBwKcE5il6Q1wmeA95KQLGafuI54Ay+I4D2Fm1HY2QwBADPZdCG0EO0Wg5CAHAi6k1ce3E1fdDHAQ8TuG50Ml6F4TngGNQawTWjg2iCPoAG4I5vcG/QVrLDIJMDnvyNBYMDeg7ogA7ogJ4DOqBmnwD4A/itR9A4HwAAAABJRU5ErkJggg==) no-repeat left center; } .mw-number-text.icon-pages::before { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABLCAYAAADnAAD1AAAByUlEQVR4Ae3XQ6JcQRhH8Rs7mYWT2LZt25rEtpNvicGCOid51lWhX3X/B78F1ClnjUZDHChCDgVUQAVUwF+//zTbaEzwJKuqFQJOwVOYB0fSDege8RnMg8OxA47HhMhGho4YM+BHWGTXMApZP1NxAqdKuIS3DhETC5gT0cEonM+LmH7A8BHHF4zhUMyAr3DKswt4ARvCVQ8RL8FyHIoV8DqyAEbidMCIu2AFDqUbEBiLd4EiroOVcDDdgMBJWI4rNSOugpV0MOWAa2EBIq6HVXAw1YDzYQEiboVVdCDFgLNhASIegtWwP7WAM2AVXC4Z8SKsho+pBZwDCxDxIZ7hGo5iN7ZgG/bjOj61QsB5sAARxyArMA7nUw+4GuYQcaSHv/PrlAPuhDnYh8zR9ZQDnoF1+ooXuI87uIvH+JoT8ES7B1yJxZiGETnbbAHuKqCbkbiqgG5mK6Cb8QqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogAqogG0acAwmVHRLAXschDlQQAVUwKYGXIZTDo7qFnakgAqogP4ooAK+waVh5GpSAROggAqogFKOAiqgAiqg/AUjJ7hc1MT1egAAAABJRU5ErkJggg==) no-repeat left center } .mw-number-text.icon-contributors::before { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAtCAYAAAA5reyyAAAEMElEQVR4AWJ4/uLFYMJsgHbtIVhzLQqg8G7btm3bfLZt2/abtG3btm3btt19tXuNU5UbnV9VPfj2PCtODh7DaOzHDdzEIQxFG6SERItoilcPq6EOpqNsrAdMiWb4CQPQEx+jMsSH13Ad6tJRtIf4UBkfoyf642c0Q8pwBSyOEYiDWpzHP8gIcelZ3IV6dBENIS5lxD84D7WIwwgUD3XActjk8jTLDnFQAiegPm1FFoiD7JgKdbAJ5UIVMA0WQ10aCnEwHBrQ/xAHQ6EuLULqUAT8EurRkxAbtXEWGtBu5IPYeBLq0RemA6bDUqhHwyE2/oIa8qHho3wp0pkM2AS3oR4dRCmIFWZADRkEsUIpHIR6dBtNTAZ8DepDEhpDLIphL9Q9X0dMYyRBfXjNZMD3oT61hFjUwHmoITtQAGLREurT+yYDvgn1IQ4NwhBwP0pALBogDurDmyYDPgL14QjKQCzK43gYjsAyOAL14RGTAcvhKNSjWUgLsciDzVBDliG9zceJWT53fFlzAYGJUI/+g9iYCjVkBMTGv1CPJkJMB/wM6sEdtILY6Aw15A+IjVa4A/Xgs1C9ym2AujQVkoznkQgN6CpaQAwd7euQynxA4EMkuTz6noAkIxu2QQNaAXHwhMujMAkfhvpz1gSogwEQF/pAA/oV4sIAqIPxkFAHLIwVUBuLkQ/iQkNchPp0BHkhLuTDYocjuVDoAwLNobCKx7MQZ0buxn9CPHgO8VBYNYOEI2AxTIPaWI3SEJdq47rPz1jZIC6VxmqHm17RUAYsjm+wB+rgDH5FZYgL/0M9egjiQmX8hjNQB3vwDYqZClgRn2I8TkM9uoxp+BY1IDayYAnUpd8hyaiBbzEdl6EencZ4fIoKXgPWQ0eswTmoIRexCz9DYFUWh6AOeiEFBFYfYYv7aK6cxRp0RL3kAjbBSsRBQ+gwykBg1SrAF+5qOAUNoTisRBNrwHeQAA2D7hAbLQL+qOoBDYMEvA0RRm3cg4bQIYxBO4iNnFgOdfAoJBntMAaHoSF0D7WtbwOmJGIHBuFtFHJxhx8HdeEEnoI4KIS3MQg7kAg1rI8w9kMN2YQ/8RByQRwUxE844GPvj0B9iAu58BD+NPwdcp8wrkEDOoG3kR3iIC0exhAcgQZwHQvwOfJDXMiOt3ECGtA1EwH3oDLERgoUxisYhv24AzUoEWexCD+iJtJBklEF+yId8A7aQywyoCK+xCJcRSI0TO5iL7qjDXIjBcTiIdwNGnAetmKjR8fQHdYL93tYiSRolDiJzqgLseiOYz62fyvmCcOUJ3EAGuV6oUi0rVD9BBpDtqJstARsj3hojFmBdNEQcDw0Rn0V6YAVcBIao2YjXSQDtoDGsDOoFMmAD0FjXLMHAYN5KJIBW+FBwADq4x40hrWLZMCKOIhEXIsxd3EdDSF+3QeCfPkMAgchOAAAAABJRU5ErkJggg==) no-repeat left center } /**/ /* Multimedia viewer */ .mw-mmv-post-image, .mw-mmv-image-metadata { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis { box-shadow: -4px 6px 0 0 var(--wiki-content-background-color); } .mw-mmv-title-para .mw-mmv-ttf-ellipsis { background-color: var(--wiki-content-background-color); } .mw-mmv-title-para .mw-mmv-ttf-ellipsis::before { background-image: linear-gradient(to right, transparent 0%, var(--wiki-content-background-color) 100%); } .mw-mmv-ttf-ellipsis-container:hover .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis { background-color: var(--wiki-content-background-color--secondary); } .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis:hover, .mw-mmv-ttf-ellipsis-container .mw-mmv-ttf-container .mw-mmv-ttf-ellipsis:hover { background-color: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, var(--wiki-content-dynamic-color)); } .mw-ui-button.mw-ui-progressive:not(:disabled) { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color); } .mw-ui-button.mw-ui-progressive:not(:disabled):hover { background-color: var(--wiki-accent-color--hover); } .skin-vector .mw-ui-button.mw-ui-progressive:hover, .skin-vector .mw-ui-button.mw-ui-primary:disabled { box-shadow: 0px 0px 16px rgba(0, 0, 0, 0.75) inset, 0 0 5px var(--wiki-content-border-color); border: 2px solid var(--wiki-content-border-color); } .mw-ui-button.mw-ui-progressive:not(:disabled):active, .mw-ui-button.mw-ui-progressive:not(:disabled).is-on { background-color: var(--wiki-accent-color); border-color: var(--wiki-accent-color); } .mw-ui-button.mw-ui-progressive { box-shadow: 0px 0px 16px rgba(0, 0, 0, 0.75) inset, 0 0 5px var(--wiki-content-border-color) } /* possibly deprecated */ .mw-ui-input:not(:disabled) { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-ui-input:not(:disabled):hover, .mw-ui-input:not(:disabled):focus { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); border-color: var(--wiki-accent-color); box-shadow: none; } .mw-ui-input::placeholder { color: var(--wiki-content-text-mix-color); } /* end possibly deprecated */ .mw-mmv-dialog { background-color: var(--wiki-content-background-color); box-shadow: 0 2px 2px 0 var(--wiki-content-border-color); } .mw-mmv-dialog .mw-mmv-dialog-down-arrow { background-color: var(--wiki-content-background-color); } .mw-mmv-options-dialog-header { color: var(--wiki-content-text-color); } .mw-mmv-options-text-header, .mw-mmv-options-text-body { color: var(--wiki-content-text-mix-color); } .mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu { background-image: none; } .mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu span { display: none; } .mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-select-menu::after { display: inline-block; width: 8px; height: 100%; content: ''; --mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2212%22 viewBox=%220 0 12 12%22%3E %3Cpath fill=%22%23000%22 fill-rule=%22evenodd%22 d=%22m2.023 3 3.49 5.953L9 3z%22 clip-rule=%22evenodd%22/%3E %3C/svg%3E") no-repeat; --mask-size: 12px; --mask-position: center; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: var(--mask-size); mask-size: var(--mask-size); -webkit-mask-position: var(--mask-position); mask-position: var(--mask-position); background-color: currentColor; } .mw-mmv-embed-dimensions { color: color-mix(in srgb, var(--wiki-content-text-color) 76%, transparent); } .oo-ui-optionWidget-selected .mw-mmv-embed-dimensions { color: color-mix(in srgb, var(--wiki-content-text-color) 82%, transparent); } .mw-mmv-download-pane .mw-mmv-download-attribution { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-mix-color); } .mw-mmv-download-pane .mw-mmv-download-attribution:hover { background-color: var(--wiki-content-dynamic-color--inverted); color: var(--wiki-content-text-color); } .mw-mmv-download-pane .mw-mmv-download-area .mw-mmv-download-preview-link, .mw-mmv-download-pane .mw-mmv-download-attribution-cta-invite { color: var(--wiki-content-text-mix-color); } .mw-ui-button.mw-ui-quiet, .mw-ui-button.mw-ui-quiet.mw-ui-progressive, .mw-ui-button.mw-ui-quiet.mw-ui-destructive { color: var(--wiki-accent-color); } .mw-ui-button.mw-ui-progressive:not(:disabled):focus { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 1), inset 0 0 0 2px var(--wiki-accent-color); } input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet, input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet.mw-ui-progressive, input[type="checkbox"]:active + .mw-ui-button.mw-ui-quiet.mw-ui-destructive, .mw-ui-button.mw-ui-quiet:active, .mw-ui-button.mw-ui-quiet.mw-ui-progressive:active, .mw-ui-button.mw-ui-quiet.mw-ui-destructive:active, input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet, input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet.mw-ui-progressive, input[type="checkbox"]:focus + .mw-ui-button.mw-ui-quiet.mw-ui-destructive, .mw-ui-button.mw-ui-quiet:focus, .mw-ui-button.mw-ui-quiet.mw-ui-progressive:focus, .mw-ui-button.mw-ui-quiet.mw-ui-destructive:focus { color: var(--wiki-content-text-color); } /**/ /* Echo */ .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-optionWidget-selected > .oo-ui-buttonElement-button:hover { color: var(--wiki-accent-label-color); } .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover { color: var(--wiki-content-text-color); } @-webkit-keyframes unseen-fadeout-to-unread { from { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); } to { background-color: var(--wiki-content-background-color--secondary); } } @keyframes unseen-fadeout-to-unread { from { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); } to { background-color: var(--wiki-content-background-color--secondary); } } @-webkit-keyframes unseen-fadeout-to-read { from { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); } to { background-color: var(--wiki-content-background-color); } } @keyframes unseen-fadeout-to-read { from { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); } to { background-color: var(--wiki-content-background-color); } } .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before { border-bottom-color: var(--wiki-content-border-color); } .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after { border-bottom-color: var(--wiki-content-background-color--secondary); } .client-js .mw-echo-special-nojs { filter: var(--wiki-icon-general-filter) } /**/ /* codex fixes */ .cdx-checkbox__icon { background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); } .mw-echo-ui-toggleReadCircleButtonWidget:hover .mw-echo-ui-toggleReadCircleButtonWidget-circle { background-color: var(--wiki-accent-color--hover); } .mw-echo-ui-toggleReadCircleButtonWidget-circle-unread { background-color: transparent; } .mw-echo-ui-toggleReadCircleButtonWidget:hover .mw-echo-ui-toggleReadCircleButtonWidget-circle-unread { background-color: var(--wiki-content-text-mix-color-95); } /**/ /************************* * End Vector theme fixes * **************************/ /************************ * Theme-based Scribunto * *************************/ #mw-scribunto-input { background-color: var(--wiki-content-background-color--secondary); border: 1px solid var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .mw-scribunto-console-fieldset, .mw-scribunto-message, .mw-scribunto-input, .mw-scribunto-error, .mw-scribunto-print, .mw-scribunto-normalOutput { background: transparent; } .mw-scribunto-console-fieldset { color: var(--wiki-content-text-color); } .mw-scribunto-message { color: var(--wiki-content-text-color); } .mw-scribunto-input { color: var(--wiki-content-text-color--hover); } .mw-scribunto-error { color: var(--wiki-alert-color); } .mw-scribunto-print { color: var(--wiki-content-text-color); } .mw-scribunto-normalOutput { color: var(--wiki-content-text-color); } /**************** * End Scribunto * *****************/ /*************************** * Theme-based VisualEditor * ****************************/ .ve-activated .vector-menu-tabs .selected { box-shadow: none; } .ve-init-mw-progressBarWidget { background-color: var(--wiki-content-background-color); border-color: var(--wiki-accent-color); box-shadow: 0 1px 1px color-mix(in srgb, var(--wiki-content-dynamic-color) 15%, transparent); } .ve-init-mw-progressBarWidget-bar { background-color: var(--wiki-accent-color); } .ve-init-mw-desktopArticleTarget-toolbarPlaceholder-bar { border-bottom-color: var(--wiki-content-border-color); } .ve-init-mw-desktopArticleTarget-toolbarPlaceholder-floating .ve-init-mw-desktopArticleTarget-toolbarPlaceholder-bar { top: var(--wikigg-header-scroll-height, 0); background: var(--wiki-content-background-color); } div.ve-ce-branchNode { border-color: var(--wiki-content-border-color); } .ve-ce-focusableNode-highlight { background: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .ve-ce-surface-highlights-focused .ve-ce-focusableNode-highlights { opacity: 0.25; } .ve-ce-branchNode-blockSlug, .ve-ce-branchNode-newSlug:not(.ve-ce-branchNode-newSlug-open) { outline-color: var(--wiki-accent-color); background-color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 75%, transparent); } figure[typeof~='mw:File/Thumb'], figure[typeof~='mw:File/Frame'], figure[typeof~='mw:Image/Thumb'], figure[typeof~='mw:Video/Thumb'], figure[typeof~='mw:Audio/Thumb'], figure[typeof~='mw:Image/Frame'], figure[typeof~='mw:Video/Frame'], figure[typeof~='mw:Audio/Frame'] { border-color: var(--wiki-content-border-color); background-color: var(--wiki-content-background-color--secondary); } figure[typeof~='mw:File/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:File/Frame'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Image/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Video/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Audio/Thumb'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Image/Frame'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Video/Frame'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Audio/Frame'] > a:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:File/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:File/Frame'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Image/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Video/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Audio/Thumb'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Image/Frame'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Video/Frame'] > span:first-child > *:first-child:not(.mw-broken-media), figure[typeof~='mw:Audio/Frame'] > span:first-child > *:first-child:not(.mw-broken-media) { border-color: var(--wiki-content-border-color); background: var(--wiki-content-background-color--secondary); } figure[typeof~='mw:File/Thumb'] > figcaption, figure[typeof~='mw:File/Frame'] > figcaption, figure[typeof~='mw:Image/Thumb'] > figcaption, figure[typeof~='mw:Video/Thumb'] > figcaption, figure[typeof~='mw:Audio/Thumb'] > figcaption, figure[typeof~='mw:Image/Frame'] > figcaption, figure[typeof~='mw:Video/Frame'] > figcaption, figure[typeof~='mw:Audio/Frame'] > figcaption { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .ve-ui-specialCharacterPage-character, .oo-ui-toolbar-position-top .ve-ui-toolbarDialog-position-above, .oo-ui-bookletLayout > .oo-ui-menuLayout-menu, .ve-ui-mwTwoPaneTransclusionDialogLayout > .oo-ui-menuLayout-menu, .ve-ui-specialCharacterPage-character:hover { border-color: var(--wiki-content-border-color); } .ve-ui-specialCharacterPage-character:hover { box-shadow: inset 0 0 1px 1px var(--wiki-accent-color); } .oo-ui-listToolGroup-tools .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-title, .oo-ui-popupToolGroup-tools .oo-ui-tool-link .oo-ui-tool-accel { color: var(--wiki-content-text-mix-color); } .oo-ui-barToolGroup-tools.oo-ui-toolGroup-enabled-tools .oo-ui-tool.oo-ui-widget-disabled.oo-ui-flaggedElement-primary > .oo-ui-tool-link .oo-ui-tool-title, .oo-ui-barToolGroup-tools.oo-ui-toolGroup-disabled-tools .oo-ui-tool.oo-ui-flaggedElement-primary > .oo-ui-tool-link .oo-ui-tool-title { color: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 78%, transparent); } .ve-activated .ve-init-mw-desktopArticleTarget-originalContent #catlinks:hover { background: color-mix(in srgb, var(--wiki-content-link-color) 10%, transparent); } .oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected { color: var(--wiki-accent-color); box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color); } .oo-ui-tabOptionWidget { color: var(--wiki-content-text-mix-color); } .oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-widget-enabled:not(.oo-ui-optionWidget-selected):hover { color: var(--wiki-accent-color--hover); box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color--hover); } .oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-widget-enabled:not(.oo-ui-optionWidget-selected):active { color: var(--wiki-content-text-color); box-shadow: inset 0 -2px 0 0 var(--wiki-accent-color--hover); } .oo-ui-tabSelectWidget-frameless { box-shadow: inset 0 -1px 0 0 var(--wiki-content-border-color); } .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid .oo-ui-inputWidget-input { border-color: var(--wiki-alert-color); } .ve-ce-linkAnnotation.ve-ce-annotation-active { box-shadow: 0 0 0 1px color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); background-color: color-mix(in srgb, var(--wiki-content-link-color) 10%, transparent); } .ve-ui-mwInternalLinkContextItem-withImage > .oo-ui-iconElement.oo-ui-iconElement-icon { background-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color)); border-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color)); filter: unset; } .mw-widget-titleWidget-menu-withImages .mw-widget-titleOptionWidget.oo-ui-iconElement > .oo-ui-iconElement-icon.mw-widget-titleOptionWidget-hasImage { filter: unset; } .mw-widget-titleWidget-menu-withImages .mw-widget-titleOptionWidget.oo-ui-iconElement > .oo-ui-iconElement-icon:not(.mw-widget-titleOptionWidget-hasImage) { background-color: color-mix(in srgb, var(--wiki-content-text-mix-color-95) 90%, var(--wiki-content-dynamic-color)); filter: unset; } .ve-ui-desktopContext .ve-ui-linkContextItem .ve-ui-linkContextItem-label .ve-ui-linkContextItem-label-preview { color: var(--wiki-content-text-mix-color); } .ve-ui-toolbarDialog { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent); } .ve-ce-languageAnnotation { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 20%, transparent); border-color: var(--wiki-content-link-color); } .mw-widget-mediaResultWidget-overlay { box-shadow: inset 0 0 0 1px var(--wiki-content-border-color); } .mw-widget-mediaResultWidget .mw-widget-mediaResultWidget-nameLabel { color: #fff; } .oo-ui-processDialog-actions-safe .oo-ui-widget-enabled.oo-ui-iconElement:not(.oo-ui-labelElement) > .oo-ui-buttonElement-button { background-color: transparent; border-right-color: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); } .oo-ui-selectFileWidget-dropTarget { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } .oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget { background-color: var(--wiki-content-background-color); } .oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover { border-color: var(--wiki-content-text-mix-color); } .oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget, .oo-ui-selectFileWidget.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileInputWidget-info > .oo-ui-inputWidget-input { background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent); color: var(--wiki-accent-color); } .oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget, .oo-ui-selectFileWidget.oo-ui-selectFileInputWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget { background-color: var(--wiki-content-text-mix-color-95); border-color: var(--wiki-content-dynamic-color--secondary); } .mw-upload-bookletLayout-filePreview { background-color: var(--wiki-content-background-color--secondary); } .ve-ui-mwMediaDialog-panel-imageinfo-details { color: var(--wiki-content-text-mix-color); } .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-inputWidget-input { -webkit-text-fill-color: color-mix(in srgb, var(--wiki-content-text-color) 50%, transparent); } .oo-ui-optionWidget.oo-ui-widget-disabled { color: var(--wiki-content-text-mix-color); } .ve-ui-mwLanguagesPage-languages-table th, .ve-ui-mwLanguagesPage-languages-table td { border-bottom-color: var(--wiki-content-border-color); } .ve-ui-mwLanguagesPage-languages-table tr:nth-child(even) td { background: var(--wiki-content-background-color); } .ve-ui-mwLanguagesPage-languages-table tr:nth-child(odd) td { background: color-mix(in srgb, var(--wiki-content-dynamic-color--secondary) 5%, transparent); } .ve-ui-targetWidget { border-color: var(--wiki-content-border-color); } .ve-ui-targetWidget:not(.oo-ui-pendingElement-pending) { background: var(--wiki-content-background-color); } .ve-ui-targetWidget-focused { border-color: var(--wiki-accent-color); box-shadow: inset 0 0 0 1px var(--wiki-accent-color); } .ve-ui-mwTransclusionOutlineTemplateWidget-sticky { background-color: var(--wiki-content-background-color); } .ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.oo-ui-optionWidget-highlighted { color: var(--wiki-content-dynamic-color); } .ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage, .ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage:hover, .ve-ui-mwTransclusionOutlineTemplateWidget .ve-ui-mwTransclusionOutlineParameterWidget.ve-ui-mwTransclusionOutlineParameterWidget-activePage.oo-ui-optionWidget-highlighted { color: var(--wiki-accent-color); } .ve-ui-mwTransclusionOutlineTemplateWidget-no-template-parameters { color: var(--wiki-content-text-mix-color); } .ve-ui-mwTemplatePage-description { color: var(--wiki-content-text-mix-color); } .ve-ui-mwParameterPage-doc-required, .ve-ui-mwParameterPage-doc-deprecated, .ve-ui-mwParameterPage-inlineDescription .ve-ui-mwParameterPage-doc-example { color: var(--wiki-content-text-mix-color); } .ve-ui-expandableContent-fade { background: linear-gradient(to right, transparent 0, var(--wiki-content-background-color) 90%); } .ve-ui-expandableContent-toggle { background-color: var(--wiki-content-background-color); } .ve-ui-mwParameterPage-undocumentedLabel { color: var(--wiki-content-text-mix-color); } .oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header > .oo-ui-labelElement-label { color: var(--wiki-content-text-mix-color); } .ve-ui-mwLatexDialog-content .oo-ui-bookletLayout-stackLayout h3 { color: var(--wiki-content-text-mix-color); } .ve-ui-mwLatexPage-symbol { border-color: var(--wiki-content-border-color); } .ve-ui-mwGalleryDialog-highlighted-image { background-color: var(--wiki-content-background-color--secondary); } .ve-ui-mwHelpListToolGroup-tools-footer { border-color: var(--wiki-content-border-color); } .ve-ui-mwHelpListToolGroup-version-link, .ve-ui-mwHelpListToolGroup-version-date, .ve-ui-mwHelpPopupTool-version-label, .ve-ui-mwHelpPopupTool-version-link, .ve-ui-mwHelpPopupTool-version-date { color: var(--wiki-content-text-mix-color); } .ve-ui-mwSaveDialog-summary { background-color: var(--wiki-content-background-color); } .ve-ui-mwSaveDialog-options { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .ve-ui-mwSaveDialog-license { color: var(--wiki-content-text-mix-color); } .oo-ui-processDialog .oo-ui-actionWidget:not(.oo-ui-flaggedElement-progressive):not(.oo-ui-flaggedElement-destructive) > .oo-ui-buttonElement-button:hover, .oo-ui-processDialog .oo-ui-actionWidget:not(.oo-ui-flaggedElement-progressive):not(.oo-ui-flaggedElement-destructive) > .oo-ui-buttonElement-button:active { border-right-color: var(--wiki-accent-color); border-left-color: var(--wiki-accent-color); } .ve-ui-debugBar { border-color: var(--wiki-content-border-color); } .ve-ui-debugBar-commands-divider { border-color: var(--wiki-content-border-color); } .ve-ui-debugBar-dump > table { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .ve-ui-debugBar-dump td { background-color: var(--wiki-content-background-color); } .ve-ui-debugBar-dump th { color: color-mix(in srgb, var(--wiki-content-text-color) 80%, transparent); text-shadow: 0 1px 1px var(--wiki-content-dynamic-color--inverted); } .ve-ui-debugBar-dump ol { color: color-mix(in srgb, var(--wiki-content-text-color) 60%, transparent); } .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-element, .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-char, .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-achar { background-color: var(--wiki-content-background-color--secondary); color: var(--wiki-content-dynamic-color); text-shadow: 0 1px 1px var(--wiki-content-dynamic-color--inverted); } .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-element { background-color: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); } .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-char { background-color: color-mix(in srgb, var(--wiki-success-color) 20%, transparent); } .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-achar { background-color: color-mix(in srgb, var(--wiki-warning-color) 20%, transparent); } .ve-ui-debugBar-dump li .ve-ui-debugBar-dump-note { color: var(--wiki-content-text-mix-color); } .ve-ui-debugBar-filibuster { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .ve-ui-debugBar-transactions > ol > li { border-color: var(--wiki-content-border-color); } /******************* * End VisualEditor * ********************/ /************************** * Theme-based AbuseFilter * ***************************/ table.mw-abuselog-details { background: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } table.mw-abuselog-details th, table.mw-abuselog-details td, div.mw-abusefilter-editor { border-color: var(--wiki-content-border-color); } table.mw-abuselog-details th { background: var(--wiki-content-background-color--secondary); } body td.mw-abusefilter-history-changed { background-color: color-mix(in srgb, var(--wiki-alert-color) 20%, transparent); } /****************** * End AbuseFilter * *******************/ /************************************ * Theme-based Special:MultiPageEdit * *************************************/ :root { --jexcel-border-color: var(--wiki-content-border-color); /* this is defined by the extension but does not seem to be used anywhere. We override it just in case *shrug* */ } .jexcel, .jexcel_container.fullscreen .jexcel_content { background-color: var(--wiki-content-background-color); border-bottom-color: var(--wiki-content-border-color); border-right-color: var(--wiki-content-border-color); } table.jexcel > tbody > tr > td:first-child, table.jexcel > thead, table.jexcel > thead > tr > td, table.jexcel > tbody > tr.selected > td:first-child, table.jexcel > thead > tr > td.selected { background-color: var(--wiki-content-background-color--secondary); } table.jexcel > tbody > tr.selected > td:first-child, table.jexcel > thead > tr > td.selected { background-color: color-mix(in srgb, var(--wiki-accent-color) 10%, transparent); } table.jexcel > thead > tr > td { border-bottom-color: var(--wiki-content-border-color); } .jexcel > thead > tr > td.arrow-up, .jexcel > thead > tr > td.arrow-down { background: none; } .jexcel > thead > tr > td.arrow-up::after, .jexcel > thead > tr > td.arrow-down::after { display: inline-block; position: absolute; right: 0; top: 0; background-repeat: no-repeat; background-position: center right 5px; width: 22px; height: 100%; content: ''; filter: brightness(50%) var(--wiki-icon-general-filter); } .jexcel > thead > tr > td.arrow-up::after { background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 14l5-5 5 5H7z' fill='gray'/%3E%3C/svg%3E"); } .jexcel > thead > tr > td.arrow-down::after { background-image: url("data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath d='M7 10l5 5 5-5H7z' fill='gray'/%3E%3C/svg%3E"); } .jexcel > thead > tr:nth-child(2) > td { z-index: 1; /* prevents overlapping the headings after scrolling on tall tables */ } .jexcel > tbody > tr > td { border-top-color: var(--wiki-content-text-mix-color-95); border-bottom-color: var(--wiki-content-text-mix-color-95); } .jexcel > tbody > tr > td.readonly { color: var(--wiki-content-text-mix-color); } .jexcel_content { scrollbar-color: var(--wiki-content-text-mix-color) transparent; /* we need this important to override inline styling */ box-shadow: var(--wiki-content-dynamic-color--secondary--inverted) 2px 2px 5px 0.1px !important; } .jexcel .highlight { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 5%, transparent); } .jexcel .highlight-top { border-top-color: var(--wiki-content-text-mix-color); box-shadow: 0px -1px var(--wiki-content-dynamic-color--secondary--inverted); } .jexcel .highlight-left { border-left-color: var(--wiki-content-text-mix-color); box-shadow: -1px 0px var(--wiki-content-dynamic-color--secondary--inverted); } .jexcel .highlight-top.highlight-left { box-shadow: -1px -1px var(--wiki-content-dynamic-color--secondary--inverted); } .jexcel .highlight-right { border-right-color: var(--wiki-content-text-mix-color); } .jexcel .highlight-bottom { border-bottom-color: var(--wiki-content-text-mix-color); } .jexcel .jexcel_column_filter { background: none; } .jexcel .jexcel_column_filter::after { display: inline-block; position: absolute; right: 0; top: 0; background-repeat: no-repeat; background-position: top 50% right 5px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='gray' width='18px' height='18px'%3E%3Cpath d='M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); width: 20px; height: 100%; content: ''; filter: brightness(50%) var(--wiki-icon-general-filter); } .jexcel_pagination > div > div { background-color: var(--wiki-accent-color); /* we need this important to override a built-in one */ color: var(--wiki-accent-label-color) !important; } .jexcel_page_selected { background: linear-gradient(to bottom, var(--wiki-accent-color) 0%, var(--wiki-accent-color--hover) 100%); /* we need this important to override a built-in one */ border: 1px solid var(--wiki-content-border-color) !important; } /**************************** * End Special:MultiPageEdit * *****************************/ /*********************** * Theme-based msupload * ************************/ #msupload-div, #msupload-list .file { background-color: var(--wiki-content-background-color); border-color: var(--wiki-content-border-color); } #msupload-select { filter: brightness(0) var(--wiki-icon-to-link-filter); } #msupload-dropzone { border-color: var(--wiki-content-border-color); color: var(--wiki-content-text-color); } .drop-over { background-color: var(--wiki-accent-color); color: var(--wiki-accent-label-color) !important; } #msupload-bottom { border-color: var(--wiki-content-border-color); } #msupload-bottom #msupload-files { padding-left: 0; background: none; } #msupload-bottom #msupload-files::before { display: inline-block; background: url(/extensions/MsUpload/resources/images/msu-upload-icon.png?bdd61) no-repeat 0 0; background-position: left center; height: 22px; width: 25px; content: ''; vertical-align: top; filter: var(--wiki-icon-general-filter); } #msupload-list .file .file-size { color: var(--wiki-content-text-mix-color); } #msupload-div a { color: var(--wiki-content-link-color); } #msupload-list .file .file-name:hover { background-color: var(--wiki-content-dynamic-color--inverted); } #msupload-list .file .file-name-input { background: var(--wiki-content-dynamic-color--inverted); } #msupload-list .file .file-warning { color: var(--wiki-warning-color); } /*************************** * End theme-based msupload * ****************************/ /***************************** * Theme-based commentstreams * ******************************/ .cs-title-edit-field { border-color: var(--wiki-accent-color); } .cs-title-edit-field::placeholder, .view-dark .cs-body-edit-field::placeholder { color: var(--wiki-content-text-mix-color); } .cs-edit-box, .cs-expanded .cs-comment-header { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .cs-target-comment .cs-comment-header { border-color: var(--wiki-accent-color); } .cs-comment-author a { color: var(--wiki-content-link-color); } .cs-comment-details { color: color-mix(in srgb, var(--wiki-content-text-color) 95%, transparent); } .cs-comment-author-anonymous { color: color-mix(in srgb, var(--wiki-content-text-color) 95%, transparent); } .cs-comment { border: 1px solid var(--wiki-content-border-color); } .cs-comment-body { padding: 0 5px; } /********************************* * End theme-based commentstreams * **********************************/ /************************ * Theme-based checkuser * *************************/ .mw-datatable.ext-checkuser-investigate-table tr:hover td { background-color: var(--wiki-content-background-color); } .mw-datatable.ext-checkuser-investigate-table th { background-color: var(--wiki-content-background-color--secondary); } .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td, .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td, .ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) .ext-checkuser-investigate-table-row-hover-data-match td, .ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr:hover td { background-color: color-mix(in srgb, var(--wiki-warning-color) 10%, transparent); } .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td.ext-checkuser-investigate-table-cell-pinned, .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td.ext-checkuser-investigate-table-cell-pinned, .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned td.ext-checkuser-investigate-table-cell-pinned-data-match, .ext-checkuser-investigate-table.mw-datatable.ext-checkuser-investigate-table-pinned .ext-checkuser-investigate-table-row-pinned-data-match td.ext-checkuser-investigate-table-cell-pinned-data-match, .ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr td.ext-checkuser-investigate-table-cell-hover-data-match, .ext-checkuser-investigate-table.mw-datatable:not(.ext-checkuser-investigate-table-pinned) tr td:hover.ext-checkuser-investigate-table-cell-pinnable { background-color: color-mix(in srgb, var(--wiki-warning-color) 40%, transparent); } .ext-checkuser-investigate-copy-message.oo-ui-messageWidget.oo-ui-messageWidget-block.oo-ui-flaggedElement-notice { background-color: var(--wiki-content-background-color--secondary); border-color: var(--wiki-content-border-color); } .mw-special-Investigate .ext-checkuser-investigate-subtitle-fieldset { background-color: var(--wiki-content-background-color--secondary); } /**************** * End checkuser * *****************/ /*************************** * Theme-based SearchDigest * ****************************/ .searchdigest-stats-table { border-color: var(--wiki-content-border-color); border-collapse: collapse; } .searchdigest-stats-table thead th, .searchdigest-stats-table tr:not(:last-child) th, .searchdigest-stats-table tr:not(:last-child) td { border-bottom-color: var(--wiki-content-border-color); } .searchdigest-stats-table thead th:last-child, .searchdigest-stats-table td { border-left-color: var(--wiki-content-border-color); } .searchdigest-stats-table thead tr { background: var(--wiki-content-background-color--secondary); } /******************* * End SearchDigest * ********************/ /**************************** * Extension:RelatedArticles * *****************************/ .client-js .read-more-container { min-height: unset; } @media (min-width: 1000px) { .client-js .read-more-container { min-height: calc( 80px/*card height*/ + 10px/*card margin*/ + 1em/*container padding*/ + 0.3em/*card-list margin*/ + 0.8em/*h2 font-size*/ + 1em/*h2 padding*/ + 0.6em/*h2 margin*/ + 1px /*container border*/ ); } } .ext-related-articles-card-list .ext-related-articles-card { background-color: var(--wiki-content-background-color); } .ext-related-articles-card-list .ext-related-articles-card, .ext-related-articles-card-list .ext-related-articles-card + .ext-related-articles-card { /* your guess is as good as mine for why they did this */ border-color: color-mix(in srgb, var(--wiki-content-border-color) 20%, transparent); } .ext-related-articles-card-list .ext-related-articles-card-thumb { background-color: var(--wiki-content-background-color--secondary); } .ra-read-more h2 { color: var(--wiki-body-dynamic-color--secondary); } .ext-related-articles-card-list h3 a { color: var(--wiki-content-heading-color); } .ext-related-articles-card-list h3::after { background-image: linear-gradient(to right, transparent, var(--wiki-content-background-color) 50%); } .ext-related-articles-card-list .ext-related-articles-card-extract { color: color-mix(in srgb, var(--wiki-content-text-color) 50%, transparent); } /* removed background image and use a mask image instead */ .ext-related-articles-card-list .ext-related-articles-card-thumb-placeholder { position: relative; background-image: none; } .ext-related-articles-card-list .ext-related-articles-card-thumb-placeholder::after { position: absolute; width: 100%; height: 100%; top: 0; left: 0; content: ''; --mask-image: url("/extensions/RelatedArticles/resources/ext.relatedArticles.readMore/article.svg?3c572"); --mask-size: 40px; --mask-repeat: no-repeat; --mask-position: center; -webkit-mask: var(--mask-image); mask: var(--mask-image); -webkit-mask-size: var(--mask-size); mask-size: var(--mask-size); -webkit-mask-repeat: var(--mask-repeat); mask-repeat: var(--mask-repeat); -webkit-mask-position: var(--mask-position); mask-position: var(--mask-position); background-color: color-mix(in srgb, var(--wiki-content-text-color) 75%, transparent); } /**/ /* this simulates mw-footer having a top border */ .read-more-container { border-bottom: var(--wiki-content-border-width, 1px) solid var(--wiki-content-border-color); } @media screen and (min-width: 720px) { .read-more-container { margin-right: 1em; } } /******************************** * End Extension:RelatedArticles * *********************************/ /******************* * Extension:Popups * ********************/ .mwe-popups { box-shadow: 0 30px 90px -20px rgba(0, 0, 0, 0.3), 0 0 1px 1px color-mix(in srgb, var(--wiki-content-border-color) 5%, transparent); } .mwe-popups, .mwe-popups .mwe-popups-container { background-color: var(--wiki-content-background-color); color: var(--wiki-content-text-color); } .mwe-popups .mwe-popups-extract { color: var(--wiki-content-text-color); } .mwe-popups .mwe-popups-extract[dir="ltr"]::after { background-image: linear-gradient(to right, transparent, var(--wiki-content-background-color) 50%); } .mwe-popups.flipped-y::before, .mwe-popups.flipped-x-y::before, .mwe-popups.mwe-popups-image-pointer::before, .mwe-popups.mwe-popups-image-pointer.flipped-x::before, .mwe-popups.mwe-popups-no-image-pointer::before, .mwe-popups.flipped-x.mwe-popups-is-tall::before, .mwe-popups.flipped-x-y.mwe-popups-is-tall::before { border-color: var(--wiki-content-border-color); } .mwe-popups.flipped-y::after, .mwe-popups.flipped-x-y::after, .mwe-popups.mwe-popups-image-pointer::after, .mwe-popups.mwe-popups-image-pointer.flipped-x::after, .mwe-popups.mwe-popups-no-image-pointer::after, .mwe-popups.flipped-x-y.mwe-popups-is-tall::after { border-color: var(--wiki-content-background-color); } .popups-icon { position: relative; background-position: center; background-repeat: no-repeat; background-size: calc(max(1.4285714em, 20px)); min-width: 20px; min-height: 20px; width: 1.4285714em; height: 1.4285714em; display: inline-block; vertical-align: text-bottom; } .popups-icon--preview-generic, .popups-icon--settings, .popups-icon--infoFilled, .popups-icon--infoFilled:lang(ar), .popups-icon--close, .popups-icon--reference-generic, .popups-icon--reference-book, .popups-icon--preview-disambiguation { background-image: none; } .popups-icon::after { position: absolute; width: 100%; height: 100%; top: 0; left: 0; content: ''; -webkit-mask-image: var(--mask-image, none); mask-image: var(--mask-image, none); -webkit-mask-repeat: var(--mask-repeat, no-repeat); mask-repeat: var(--mask-repeat, no-repeat); -webkit-mask-size: var(--mask-size, calc(max(1.4285714em, 20px))); mask-size: var(--mask-size, calc(max(1.4285714em, 20px))); -webkit-mask-position: var(--mask-position, center); mask-position: var(--mask-position, center); background-color: var(--mask-color, currentColor); background-color: var(--mask-color, currentColor); } .popups-icon--preview-generic::after { --mask-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Ctitle%3E sad face %3C/title%3E %3Cpath d=%22M2 0a2 2 0 0 0-2 2v18l4-4h14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm4 4c1.336 0 2.007 1.617 1.06 2.56-.943.947-2.56.276-2.56-1.06A1.5 1.5 0 0 1 6 4zm8 0c1.336 0 2.007 1.617 1.06 2.56-.943.947-2.56.276-2.56-1.06A1.5 1.5 0 0 1 14 4zm-4 5c2.61 0 4.83.67 5.65 3H4.35C5.17 9.67 7.39 9 10 9z%22/%3E %3C/svg%3E"); } .popups-icon--settings::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><g transform=\"translate(10 10)\"><path id=\"cdx-icon-settings-a\" d=\"M1.5-10h-3l-1 6.5h5m0 7h-5l1 6.5h3\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(45)\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(90)\"/><use xlink:href=\"%23cdx-icon-settings-a\" transform=\"rotate(135)\"/></g><path d=\"M10 2.5a7.5 7.5 0 000 15 7.5 7.5 0 000-15v4a3.5 3.5 0 010 7 3.5 3.5 0 010-7\"/></svg>"); } .popups-icon--infoFilled::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zM9 5h2v2H9zm0 4h2v6H9z\"/></svg>"); } .popups-icon--infoFilled:lang(ar)::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M8 19a1 1 0 001 1h2a1 1 0 001-1v-1H8zm9-12a7 7 0 10-12 4.9S7 14 7 15v1a1 1 0 001 1h4a1 1 0 001-1v-1c0-1 2-3.1 2-3.1A7 7 0 0017 7z\"/></svg>"); } .popups-icon--close::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"m4.34 2.93 12.73 12.73-1.41 1.41L2.93 4.35z\"/><path d=\"M17.07 4.34 4.34 17.07l-1.41-1.41L15.66 2.93z\"/></svg>"); } .popups-icon--reference-generic::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"m15 10-2.78-2.78L9.44 10V1H5a2 2 0 00-2 2v14a2 2 0 002 2h10a2 2 0 002-2V3a2 2 0 00-2-2z\"/></svg>"); } .popups-icon--reference-book::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M15 2a7.65 7.65 0 00-5 2 7.65 7.65 0 00-5-2H1v15h4a7.65 7.65 0 015 2 7.65 7.65 0 015-2h4V2zm2.5 13.5H14a4.38 4.38 0 00-3 1V5s1-1.5 4-1.5h2.5z\"/><path d=\"M9 3.5h2v1H9z\"/></svg>"); } .popups-icon--reference-journal::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M2 18.5A1.5 1.5 0 003.5 20H5V0H3.5A1.5 1.5 0 002 1.5zM6 0v20h10a2 2 0 002-2V2a2 2 0 00-2-2zm7 8H8V7h5zm3-2H8V5h8z\"/></svg>"); } .popups-icon--reference-news::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M5 2a2 2 0 00-2 2v12a1 1 0 01-1-1V5h-.5A1.5 1.5 0 000 6.5v10A1.5 1.5 0 001.5 18H18a2 2 0 002-2V4a2 2 0 00-2-2zm1 2h11v4H6zm0 6h6v1H6zm0 2h6v1H6zm0 2h6v1H6zm7-4h4v5h-4z\"/></svg>"); } .popups-icon--reference-web::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M2 2a2 2 0 00-2 2v12a2 2 0 002 2h16a2 2 0 002-2V4a2 2 0 00-2-2zm2 1.5A1.5 1.5 0 112.5 5 1.5 1.5 0 014 3.5zM18 16H2V8h16z\"/></svg>"); } .popups-icon--preview-disambiguation::after { --mask-image: url("data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"%23202122\"><path d=\"M7 0a2 2 0 00-2 2h9a2 2 0 012 2v12a2 2 0 002-2V2a2 2 0 00-2-2z\"/><path d=\"M13 20a2 2 0 002-2V5a2 2 0 00-2-2H4a2 2 0 00-2 2v13a2 2 0 002 2zM9 5h4v5H9zM4 5h4v1H4zm0 2h4v1H4zm0 2h4v1H4zm0 2h9v1H4zm0 2h9v1H4zm0 2h9v1H4z\"/></svg>"); } /*********************** * End Extension:Popups * ************************/ /************************* * Extension:CiteThisPage * **************************/ .mw-specialCiteThisPage-bibliographic { background-color:var(--wiki-content-background-color--secondary); } /***************************** * End Extension:CiteThisPage * ******************************/ /************************* * Extension:ImageMap * **************************/ .noresize img { /* Why does the ImageMap container have no special class name? */ display: block; /* fix the scrollbar issue */ } /***************************** * End Extension:ImageMap * ******************************/ /********************* * Mobile adjustments * **********************/ /* Responsive Special:UserRights */ #mw-userrights-table-outer input#wpReason { width: 100%; max-width: 33.5em; } @media screen and (max-width: 720px) { html:root { /* make it won't be override by user's common.css */ --wiki-is-top-logo: 1; --wiki-left-spacing: 0px; --wiki-right-spacing: 0px; --wiki-navigation-left-spacing: 3px; --wiki-navigation-right-spacing: 3px; --wiki-content-border-radius: 0px; --wiki-content-border-top-radius: 0px; --wiki-footer-border-radius: 0px; --wiki-content-padding: 0.5rem; --wiki-navigation-menu-margin: 0.5rem; /* margin around toggle button and search box */ --wiki-navigation-height: calc(2rem + var(--wiki-is-navigation-inside-content, 0)*0.5em); --wiki-navigation-bottom-padding: 0px; --wiki-navigation-tab-height: 2rem; --wiki-navigation-search-height: calc(2rem + 4px); --wiki-navigation-right-spacing: var(--wiki-navigation-left-spacing, 0px); --wiki-logo-height: 80px; --wiki-logo-margin: 10px; --wiki-navigation-tab-full-height: calc(var(--wiki-navigation-tab-height) + max(var(--wiki-navigation-selected-border-width), var(--wiki-navigation-border-width)) + var(--wiki-content-border-width, 1px)); --wiki-head-icon-padding: 0.25rem; --wiki-head-icon-size: calc(var(--wiki-navigation-tab-height) - var(--wiki-head-icon-padding) * 2); --wiki-head-toggle-button-size: var(--wiki-navigation-search-height); --wiki-sidebar-portal-spacing: 0px; --wiki-top-spacing: var(--wiki-logo-margin); --wiki-logo-box-width: calc(min( var(--wiki-logo-file-width, 160) / var(--wiki-logo-file-height, 160) * var(--wiki-logo-height), calc(100vw - var(--wiki-navigation-menu-margin)*2 - 18px))); } #mw-head-base { width: auto; margin-left: auto; margin-right: auto; } #p-logo { max-width: 100vw; top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin, 15px))); left: calc(max(0px, (100% - var(--wiki-logo-file-width) / var(--wiki-logo-file-height) * var(--wiki-logo-box-height)) / 2)); } #mw-head { position: absolute; left: 0; width: 100%; margin: unset; top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin)) + var(--wiki-logo-box-height) + var(--wiki-logo-margin)); border-radius: 0; } #left-navigation::before { /* for left spacing */ border-bottom-width: var(--navigation-border-bottom-width); } #right-navigation::after { display: block; /* for right spacing */ } #p-cactions, #p-variants { margin-right: 0px; } #p-cactions::after, #p-variants::after { width: 0; } #p-search { position: absolute; left: var(--wiki-navigation-menu-margin); right: var(--wiki-navigation-menu-margin); top: calc(var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width)); margin: 0; padding: 0; } #mw-head::before, #mw-head::after, #p-search::before, #p-search::after { display: none; } #simpleSearch { width: auto; max-width: unset; /* override vector default of 20em */ } .vector-search-box-input { height: var(--wiki-navigation-search-height); } .vector-search-box form { margin: var(--wiki-navigation-menu-margin) 0px; } #mw-head, .mw-body, .parsoid-body, .mw-body::after, .parsoid-body::after, .mw-footer { border-left-width: 0; border-right-width: 0; border-radius: 0; } .mw-body, .parsoid-body { margin-top: 0; padding-top: calc(var(--navigation-border-bottom-width) + var(--wiki-content-padding) + var(--wiki-navigation-search-height) + var(--wiki-navigation-bottom-padding) + (var(--wiki-navigation-menu-margin) * 2)); } .mw-body::after, .parsoid-body::after { left: 0; right: 0; } #mw-data-after-content { margin-left: 0; } #mw-panel { position: unset; width: 100%; margin: 0px auto; top: 0; float: unset; } /* border-radius fix */ #mw-panel #p-ext-discordwidget + .vector-menu-portal { border-radius: calc(min(var(--wiki-sidebar-border-radius), var(--wiki-sidebar-portal-spacing) * 999)); } .vector-menu-dropdown .vector-menu-content { right: 0; left: unset; } #mw-panel .vector-menu-portal { box-sizing: border-box; border-left-width: 0; border-right-width: 0; background-color: var(--wiki-sidebar-background-color); } .vector-menu-portal .vector-menu-content { margin-top: 0; margin-bottom: 0; display: block !important; /* show all menus on mobile even if they are collapsed by collapsibleSidebarSections gadget */ } table.wikitable, table.responsive-table { display: block; overflow-x: auto; border: 0; } .mw-installed-software { word-break: unset; } .gallerybox, .gallerybox > div, .gallerybox .thumb { max-width: 100%; } /* disable float on RecentChanges legend */ .mw-changeslist-legend { float: none; margin: 0 auto; } /* advanced search options */ #mw-searchoptions table { float: none; } #mw-searchoptions table td { display: block; } /* popup when clicking the download button in multimediaviewer */ .mw-mmv-dialog { width: unset; } /* turn math elements into scroll blocks unless they're an immediate child of a span */ :not(span) > math.mwe-math-element { overflow: auto hidden; max-width: 100%; } /* Expandable mobile navigation panel */ body.has-vector-mobile-menu #mw-panel { position: absolute; --panel-offset: calc(var(--wiki-head-toggle-button-size) + var(--wiki-sidebar-offset, 0px)); top: calc(var(--wikigg-header-height) + var(--wiki-top-spacing, var(--wiki-logo-margin, 15px)) + var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0px) + var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width) + var(--wiki-navigation-menu-margin) + var(--panel-offset)); left: var(--wiki-navigation-menu-margin); right: var(--wiki-navigation-menu-margin); width: auto; z-index: 3; } body.has-vector-mobile-menu #mw-panel:not(.nav--expanded){ padding: 0; border: 0; border-image: none; } body.has-vector-mobile-menu #mw-panel .mobile-nav-toggle { position: absolute; cursor: pointer; z-index: 5; display: flex; justify-content: center; align-items: center; width: var(--wiki-head-toggle-button-size); height: var(--wiki-head-toggle-button-size); box-sizing: border-box; appearance: none; padding: 0; border: 1px solid var(--wiki-content-border-color); background-color: var(--wiki-navigation-background-color); top: calc(-1 * var(--panel-offset)); } #mw-panel #p-ext-discordwidget { background-color: var(--wiki-sidebar-background-color); padding: 0.5rem 0.25rem 0.25rem 0.5rem; border: var(--wiki-sidebar-border-width, 1px) var(--wiki-sidebar-border-style, solid) var(--wiki-sidebar-border-color); } body.has-vector-mobile-menu #mw-panel .vector-menu-portal { display: none; border-image: none; } body.has-vector-mobile-menu #mw-panel .mobile-nav-toggle.nav--expanded ~ .vector-menu-portal { display: block; } body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal { text-align: left; font-size: 110%; border-left-width: var(--wiki-sidebar-border-width, 1px); border-right-width: var(--wiki-sidebar-border-width, 1px); margin-inline: var(--wiki-sidebar-margin, 0.5em); } body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal + .vector-menu-portal { border-top-width: 0; } body.has-vector-mobile-menu #mw-navigation #mw-panel .vector-menu-portal:not(:last-child) { border-bottom-width: 0; } body.has-vector-mobile-menu #mw-panel .vector-menu-content-list { display: flex; flex-wrap: wrap; } body.has-vector-mobile-menu #mw-panel .vector-menu-content-list a { display: block; padding: 0.2rem 0.5rem; border: 1px solid transparent; } body.has-vector-mobile-menu #mw-panel .vector-menu-content-list a:hover { border-color: var(--wiki-content-link-color); } body.has-vector-mobile-menu #mw-panel #p-navigation-label { display: block; } body.has-vector-mobile-menu #p-logo { /* Logo's a part of the sidebar panel, which uses relative positioning for the expandable button. Offset the logo appropriately. */ top: calc(-1 * (var(--wiki-logo-box-height) + var(--wiki-logo-margin, 15px) + var(--wiki-content-border-width, 1px) * var(--wiki-is-navigation-inside-content, 0) + var(--wiki-navigation-height, 3em) + var(--navigation-border-bottom-width) + var(--wiki-navigation-menu-margin) + var(--panel-offset))); } .mobile-nav-toggle { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M1 3v2h18V3zm0 8h18V9H1zm0 6h18v-2H1z'/%3E%3C/svg%3E%0A"); } body.has-vector-mobile-menu #p-tb .mw-list-item > a { display: inline-flex; } body.has-vector-mobile-menu .vector-menu-content-list { flex-direction: row; } /* Search adjustments for the expandable menu */ body.has-vector-mobile-menu #p-search { /* reposition to the right when mobile sidebar menu is active */ left: calc(var(--wiki-navigation-menu-margin) * 2 + var(--wiki-head-toggle-button-size)); right: var(--wiki-navigation-menu-margin); transform: none; } body.has-vector-mobile-menu #simpleSearch { width: 100%; margin: 0 auto; } /* icon navbar tabs + expandable nav panel icon */ #mw-head { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg fill='none' height='24' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h24v24H0z' fill='none' stroke='none'/%3E%3Cpath d='M4 4l4 16l4 -14l4 14l4 -16'/%3E%3C/svg%3E"); } #mw-head .vector-menu-tabs .mw-list-item a, #mw-head .vector-menu-dropdown .vector-menu-heading, #mw-panel .mobile-nav-toggle { line-height: var(--wiki-head-icon-size); width: var(--wiki-head-icon-size); /* same as line height */ height: var(--wiki-head-icon-size); box-sizing: content-box; padding: var(--wiki-head-icon-padding); color: transparent; /**<< for watch/unwatch, the text of <a> will be plain 'watch'/'unwatch' without <span> after clicking. **/ } #mw-head .vector-menu-tabs .mw-list-item a::before, #mw-head .vector-menu-dropdown .vector-menu-heading::before, #mw-panel .mobile-nav-toggle::before { content: ""; display: block; position: unset; background-image: none; width: var(--wiki-head-icon-size); height: var(--wiki-head-icon-size); margin: 0; --mask: var(--icon) no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--wiki-navigation-text-color); } #mw-head .vector-menu-tabs .mw-list-item a:hover::before, #mw-head .vector-menu-dropdown:hover .vector-menu-heading::before, #mw-panel .mobile-nav-toggle:hover::before, #mw-panel .mobile-nav-toggle.nav--expanded::before { background-color: var(--wiki-navigation-text-color--hover, var(--wiki-content-link-color--hover)); /* fallback for backwards compatibility */ } #mw-head .vector-menu-tabs .mw-list-item.selected a::before { background-color: var(--wiki-navigation-selected-text-color); } #mw-head .vector-menu-tabs .mw-list-item a span, #mw-head .vector-menu-dropdown .vector-menu-heading span { display: none; } #mw-head .vector-menu-dropdown .vector-menu-heading::after { display: none; } #ca-ve-edit, #ca-edit { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='m16.77 8 1.94-2a1 1 0 0 0 0-1.41l-3.34-3.3a1 1 0 0 0-1.41 0L12 3.23zM1 14.25V19h4.75l9.96-9.96-4.75-4.75z'/%3E%3C/svg%3E%0A"); } #ca-ve-edit + #ca-edit { --icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='20' height='20' viewBox='0 0 20 20' aria-hidden='true'%3E%3C!----%3E%3Cg%3E%3Cpath d='M1 3v14h3v-2H3V5h1V3zm4 0v14h4v-2H7V5h2V3zm11 0v2h1v10h-1v2h3V3zm-5 0v2h2v10h-2v2h4V3z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E"); } #ca-view, #ca-view-foreign { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M10 14.5a4.5 4.5 0 1 1 4.5-4.5 4.5 4.5 0 0 1-4.5 4.5M10 3C3 3 0 10 0 10s3 7 10 7 10-7 10-7-3-7-10-7'/%3E%3Ccircle cx='10' cy='10' r='2.5'/%3E%3C/svg%3E"); } #left-navigation li[id^=ca-nstab-] { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3E article %3C/title%3E%3Cpath d='M5 1a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 3h5v1H5zm0 2h5v1H5zm0 2h5v1H5zm10 7H5v-1h10zm0-2H5v-1h10zm0-2H5v-1h10zm0-2h-4V4h4z'/%3E%3C/svg%3E%0A"); } #ca-history { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath d='M9 6v5h.06l2.48 2.47 1.41-1.41L11 10.11V6z'/%3E%3Cpath d='M10 1a9 9 0 0 0-7.85 13.35L.5 16H6v-5.5l-2.38 2.38A7 7 0 1 1 10 17v2a9 9 0 0 0 0-18'/%3E%3C/svg%3E%0A"); } #ca-talk { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpath d='M26,12H24V6a3,3,0,0,0-3-3H6A3,3,0,0,0,3,6V24.41l5.12-5.12A1.05,1.05,0,0,1,8.83,19H12v3a3,3,0,0,0,3,3h8.17a1.05,1.05,0,0,1,.71.29L29,30.41V15A3,3,0,0,0,26,12ZM12,15v2H8.83a3,3,0,0,0-2.12.88L5,19.59V6A1,1,0,0,1,6,5H21a1,1,0,0,1,1,1v6H15A3,3,0,0,0,12,15ZM27,25.59l-1.71-1.71A3,3,0,0,0,23.17,23H15a1,1,0,0,1-1-1V15a1,1,0,0,1,1-1H26a1,1,0,0,1,1,1Z'/%3E%3C/g%3E%3C/svg%3E"); } #t-contributions { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg enable-background='new 0 0 32 32' id='Stock_cut' version='1.1' viewBox='0 0 32 32' xml:space='preserve' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdesc/%3E%3Cpath d='M27,12V5h-7v0 c0-2.209-1.791-4-4-4h0c-2.209,0-4,1.791-4,4v0H1v7h0c2.209,0,4,1.791,4,4v0c0,2.209-1.791,4-4,4h0v11h11v0c0-2.209,1.791-4,4-4h0 c2.209,0,4,1.791,4,4v0h7V20h0c2.209,0,4-1.791,4-4v0C31,13.791,29.209,12,27,12L27,12z' fill='none' stroke='%23000000' stroke-linejoin='round' stroke-miterlimit='10' stroke-width='2'/%3E%3C/svg%3E"); } #ca-addsection { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpolygon points='29 15 17 15 17 3 15 3 15 15 3 15 3 17 15 17 15 28 17 28 17 17 29 17 29 15'/%3E%3C/g%3E%3C/svg%3E"); } #ca-viewsource { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath class='heroicon-ui' d='M20.59 12l-3.3-3.3a1 1 0 1 1 1.42-1.4l4 4a1 1 0 0 1 0 1.4l-4 4a1 1 0 0 1-1.42-1.4l3.3-3.3zM3.4 12l3.3 3.3a1 1 0 0 1-1.42 1.4l-4-4a1 1 0 0 1 0-1.4l4-4a1 1 0 0 1 1.42 1.4L3.4 12zm7.56 8.24a1 1 0 0 1-1.94-.48l4-16a1 1 0 1 1 1.94.48l-4 16z'/%3E%3C/svg%3E"); } #p-variants { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' %3F%3E%3Csvg id='Outlined' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle/%3E%3Cg id='Fill'%3E%3Cpath d='M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm8,13a24.28,24.28,0,0,0-.41-3.62c2.19.91,3.75,2.19,4.25,3.62Zm-2,0H17V10a20.9,20.9,0,0,1,4.34.63A20.26,20.26,0,0,1,22,15ZM17,8V4.19c1.43.5,2.71,2.06,3.62,4.25A24.28,24.28,0,0,0,17,8ZM15,4.19V8a24.28,24.28,0,0,0-3.62.41C12.29,6.25,13.57,4.69,15,4.19ZM15,10v5H10a20.26,20.26,0,0,1,.63-4.34A20.9,20.9,0,0,1,15,10ZM8,15H4.19c.5-1.43,2.06-2.71,4.25-3.62A24.28,24.28,0,0,0,8,15Zm0,2a24.28,24.28,0,0,0,.41,3.62C6.25,19.71,4.69,18.43,4.19,17Zm2,0h5v5a20.9,20.9,0,0,1-4.34-.63A20.26,20.26,0,0,1,10,17Zm5,7v3.84c-1.43-.5-2.71-2.06-3.62-4.25A24.28,24.28,0,0,0,15,24Zm2,3.84V24a24.28,24.28,0,0,0,3.62-.41C19.71,25.75,18.43,27.31,17,27.81ZM17,22V17h5a20.26,20.26,0,0,1-.63,4.34A20.9,20.9,0,0,1,17,22Zm7-5h3.84c-.5,1.43-2.06,2.71-4.25,3.62A24.28,24.28,0,0,0,24,17Zm2.87-6.12A15.11,15.11,0,0,0,23,9a15.11,15.11,0,0,0-1.85-3.87A12.12,12.12,0,0,1,26.84,10.88Zm-16-5.72A15.11,15.11,0,0,0,9,9a15.11,15.11,0,0,0-3.87,1.85A12.12,12.12,0,0,1,10.88,5.16Zm-5.72,16A15.11,15.11,0,0,0,9,23a15.11,15.11,0,0,0,1.85,3.87A12.12,12.12,0,0,1,5.16,21.12Zm16,5.72A15.11,15.11,0,0,0,23,23a15.11,15.11,0,0,0,3.87-1.85A12.12,12.12,0,0,1,21.12,26.84Z'/%3E%3C/g%3E%3C/svg%3E"); } #p-cactions { --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Ccircle cx='3' cy='10' r='2'/%3E%3Ccircle cx='17' cy='10' r='2'/%3E%3C/svg%3E%0A"); } #ca-watch { --icon: var(--icon-star-empty); } #ca-unwatch { --icon: var(--icon-star-filled); } .vector-menu-tabs #ca-watch.icon a:hover::before, .vector-menu-tabs #ca-unwatch.icon a:hover::before { background-image: none; } /* RecentChanges - prevent overflow on long summaries */ .client-js .mw-changeslist ul, .client-js .mw-changeslist table.mw-enhanced-rc { margin-left: 0; } .mw-changeslist-line-inner-comment, .mw-changeslist-line .comment { font-size: 0.9em; } .mw-userlink { overflow-wrap: anywhere; } } /* Hide the expandable navigation button for desktop users */ .mobile-nav-toggle { display: none; } /************* * End mobile * **************/ /******************************************************/ /* */ /* [END] OF WIKI.GG DEFAULT LOADOUT */ /* ALL LOCAL SKIN CUSTOMIZATIONS SHOULD GO BELOW HERE */ /* DO NOT EDIT OR DELETE THIS COMMENT BLOCK */ /* */ /******************************************************/ 737acde73ae5c553a98604c85f569e2b26fd8696 MediaWiki:Common.css 8 235 259 2025-08-20T01:24:55Z ARTIFICER 564804 Importing default loadout css text/css /* CSS placed here will be applied to all skins */ /****************************************************************************************** ********************************* Start user-edit variables ******************************* ******************************************************************************************/ /***************************************** ****** START BASIC DESIGN VARIABLES ****** ----------------------------------------*/ :root { --wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif; --wiki-sidebar-heading-font-family: sans-serif; --wiki-content-border-radius: 0px; --wiki-sidebar-border-radius: 0px; } /*---------------------------------------- ******* END BASIC DESIGN VARIABLES ******* *****************************************/ /***************************************** ****** START BASIC COLOR VARIABLES ******* ----------------------------------------*/ :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-content-background-color: #ffffff; --wiki-content-background-opacity: 100%; --wiki-content-border-color: #a7d7f9; --wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ LIGHT VIEW ] */ --wiki-accent-color: #3366cc; --wiki-accent-label-color: #ffffff; --wiki-accent-link-color: #D5FB51; --wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* end light styles */ /* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=dark, */ /* individual themes are prefixed with .theme- instead */ .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); --wiki-content-background-color: #202020; --wiki-content-background-opacity: 90%; --wiki-content-border-color: #991A51; --wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ DARK VIEW ] */ --wiki-accent-color: #ff4d9d; --wiki-accent-label-color: #000; --wiki-accent-link-color: #1e1e43; --wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* End dark styles */ /*---------------------------------------- ******* END BASIC COLOR VARIABLES ******** *****************************************/ /***************************************** **** START ADVANCED COLOR VARIABLES ****** ----------------------------------------*/ :root, .view-light { /******************* * Maybe edit these * [ LIGHT VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #111111; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #ba0000; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ LIGHT VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ LIGHT VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #bf0017; --wiki-warning-color: #b05f30; --wiki-success-color: #0c742f; /**/ /*********************************** * Likely do not need to edit these * [ LIGHT VIEW ] ************************************/ --wiki-body-dynamic-color: #000000; --wiki-body-dynamic-color--inverted: #ffffff; --wiki-body-dynamic-color--secondary: #333333; --wiki-body-dynamic-color--secondary--inverted: #cccccc; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #ffffff; --wiki-content-dynamic-color: #000000; --wiki-content-dynamic-color--inverted: #ffffff; --wiki-content-dynamic-color--secondary: #333333; --wiki-content-dynamic-color--secondary--inverted: #cccccc; /* [ LIGHT VIEW ] */ --wiki-alert-label-color: #ffffff; --wiki-warning-label-color: #ffffff; --wiki-success-label-color: #ffffff; --wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */ /**/ } .view-dark { /******************* * Maybe edit these * [ DARK VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #ededed; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #FC5B4F; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ DARK VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ DARK VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #ff576a; --wiki-warning-color: #cf721c; --wiki-success-color: #13aa45; /**/ /*********************************** * Likely do not need to edit these * [ DARK VIEW ] ************************************/ --wiki-body-dynamic-color: #ffffff; --wiki-body-dynamic-color--inverted: #000000; --wiki-body-dynamic-color--secondary: #cccccc; --wiki-body-dynamic-color--secondary--inverted: #333333; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #000; --wiki-content-dynamic-color: #ffffff; --wiki-content-dynamic-color--inverted: #000000; --wiki-content-dynamic-color--secondary: #cccccc; --wiki-content-dynamic-color--secondary--inverted: #333333; /* [ DARK VIEW ] */ --wiki-alert-label-color: #000000; --wiki-warning-label-color: #000000; --wiki-success-label-color: #000000; --wiki-icon-general-filter: invert(100%); } /*---------------------------------------- ***** END ADVANCED COLOR VARIABLES ******* *****************************************/ /***************************************** **** START ADVANCED DESIGN VARIABLES ***** ----------------------------------------*/ :root { /*********************** start logo position ----------------------*/ --wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */ --wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */ --wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */ --wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */ --wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */ /*----------------------- end logo position ***********************/ --wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */ --wiki-body-font-family: sans-serif; --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */ /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-width: 1px; --wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */ --wiki-sidebar-portal-spacing: 0px; --wiki-sidebar-border-width: var(--wiki-content-border-width); --wiki-navigation-border-radius: 0px; /* border radius of tabs */ /******************* * Maybe edit these * [ DESIGN ] ********************/ --wiki-logo-filter: none; /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-top-radius: var(--wiki-content-border-radius); --wiki-content-border-style: solid; --wiki-content-border-image: none; --wiki-content-backdrop-filter: none; --wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */ --wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */ --wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-line-height: 1.125; --wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-margin: 0.5em; --wiki-sidebar-list-item-padding: 0.25em 0.25rem; --wiki-sidebar-list-padding: 0.25rem; --wiki-sidebar-list-item-background--hover: none; /* background of hover item */ --wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */ --wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */ --wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-box-background-color: var(--wiki-content-background-color); --wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content)); --wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ --wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ /* nav tabs style. The vector gradient is default. * If you want to customize the style of tabs, it's easier to start with the following settings: * --wiki-navigation-background-image: none; * --wiki-navigation-selected-background-image: none; * --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px ); * --wiki-navigation-selected-border-bottom-background: none; * --wiki-navigation-tab-spacing: 0.25em; * --wiki-navigation-tab-padding-top: 0.5em; * --wiki-navigation-tab-padding-bottom: 0.5em; */ --wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */ --wiki-navigation-tab-padding-top: 1.25em; --wiki-navigation-tab-padding-x: 0.75em; --wiki-navigation-tab-padding-bottom: 4px; --wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */ --wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */ --wiki-navigation-border-image: none; --wiki-navigation-selected-border-image: var(--wiki-navigation-border-image); --wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%); --wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x; --wiki-navigation-background-position: left bottom, right bottom, left bottom; --wiki-navigation-background-size: 1px 100%, 1px 100%, 100%; --wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%); --wiki-navigation-selected-background-repeat: no-repeat, no-repeat; --wiki-navigation-selected-background-position: left bottom, right bottom; --wiki-navigation-selected-background-size: 1px 100%, 1px 100%; --wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px); /* affects the dropdown menu under More */ --wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color); --wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color); --wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */ --wiki-navigation-dropdown-border-width: 1px; --wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius); --wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */ --wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */ --wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */ --wiki-navigation-dropdown-border-image: none; --wiki-navigation-dropdown-backdrop-filter: none; --wiki-navigation-dropdown-box-shadow: none; /* box shadow */ /* styles of the footer */ --wiki-spacing-before-footer: 0px; --wiki-footer-border-image: none; /* padding on body element */ --wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */ --wiki-left-spacing: 0.5em; --wiki-right-spacing: 1em; --wiki-bottom-spacing: 2em; /* end design variables */ } /*---------------------------------------- ***** END ADVANCED DESIGN VARIABLES ****** *****************************************/ /******************************* **** START SHARED VARIABLES **** **** tl;dr: don't edit this **** ********************************/ /* These variables are rarely touched, usually inherit other variables, and are shared on all themes. In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision, understand what you are doing, and *know* that what you are trying to do is not accomplished by changing another variable in the above sections. Since these are by default shared across all themes, if you support multiple themes you'll probably want to separate the variables you want to modify here into .view-x blocks like above. If you don't understand what that means or how to do that then you probably shouldn't be modifying this section. */ :root { --wiki-content-border-bottom-width: var(--wiki-content-border-width); --wiki-content-border-bottom-style: var(--wiki-content-border-style); --wiki-content-border-bottom-color: var(--wiki-content-border-color); --wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%); --wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color)); --wiki-content-text-color--hover: var(--wiki-content-text-color); /* heading */ --wiki-content-heading-border-bottom-width: 1px; --wiki-content-heading-border-style: solid; --wiki-content-heading-font-weight: normal; --wiki-content-heading-font-style: normal; --wiki-content-heading-text-transform: none; --wiki-content-heading-line-height: normal; --wiki-content-heading-text-shadow: none; /* first heading (h1) */ --wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width); --wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); --wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight); --wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style); --wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform); --wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-firstheading-color: var(--wiki-content-heading-color); --wiki-content-firstheading-text-shadow: none; /* sub-heading (h3, h4, h5, h6) */ --wiki-content-subheading-border-bottom-width: 0px; --wiki-content-subheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-subheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-subheading-font-family: var(--wiki-body-font-family); --wiki-content-subheading-font-weight: bold; --wiki-content-subheading-font-style: normal; --wiki-content-subheading-text-transform: none; --wiki-content-subheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-subheading-color: var(--wiki-content-heading-color); --wiki-content-subheading-text-shadow: none; /* heading size */ --wiki-content-firstheading-font-size: 1.8em; --wiki-content-heading-h2-font-size: 1.5em; --wiki-content-heading-h3-font-size: 1.2em; --wiki-content-heading-h4-font-size: 114%; --wiki-content-heading-h5-font-size: 108%; --wiki-content-heading-h6-font-size: 100%; --wiki-content-toc-background: var(--wiki-content-background-color--secondary); --wiki-content-toc-border-width: 1px; --wiki-content-toc-border-style: solid; --wiki-content-toc-border-color: var(--wiki-content-border-color); --wiki-content-toc-border-radius: 0px; --wiki-content-toc-border-image: none; --wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000; --wiki-content-catlinks-background: var(--wiki-content-background-color--secondary); --wiki-content-catlinks-border-width: 1px; --wiki-content-catlinks-border-style: solid; --wiki-content-catlinks-border-color: var(--wiki-content-border-color); --wiki-content-catlinks-border-radius: 0px; --wiki-content-catlinks-border-image: none; --wiki-content-catlinks-box-shadow: none; --wiki-content-filetoc-background: var(--wiki-content-background-color--secondary); --wiki-content-filetoc-border-width: 1px; --wiki-content-filetoc-border-style: solid; --wiki-content-filetoc-border-color: var(--wiki-content-border-color); --wiki-content-filetoc-border-radius: 0px; --wiki-content-filetoc-border-image: none; --wiki-content-filetoc-box-shadow: none; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; --wiki-sidebar-padding: 0px; --wiki-sidebar-background-color: var(--wiki-content-background-color); --wiki-sidebar-background-opacity: var(--wiki-content-background-opacity); --wiki-sidebar-background-image: none; --wiki-sidebar-background-position: center; --wiki-sidebar-background-repeat: repeat; --wiki-sidebar-background-size: auto; --wiki-sidebar-filter: none; --wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-sidebar-border-color: var(--wiki-content-border-color); --wiki-sidebar-border-style: solid; --wiki-sidebar-border-image: none; --wiki-sidebar-link-color: var(--wiki-content-link-color); --wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover); --wiki-sidebar-heading-color: var(--wiki-content-heading-color); --wiki-sidebar-heading-font-weight: normal; --wiki-sidebar-heading-font-style: normal; --wiki-sidebar-heading-text-transform: none; --wiki-sidebar-heading-line-height: normal; --wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem; --wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-text-shadow: none; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter); --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-box-padding: 0px; --wiki-sidebar-box-background: none; --wiki-sidebar-box-border: 0px; --wiki-sidebar-box-border-image: none; --wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color)); --wiki-footer-border-width: var(--wiki-content-border-width); --wiki-footer-border-style: var(--wiki-content-border-style); --wiki-footer-border-color: var(--wiki-content-border-color); --wiki-footer-background-color: var(--wiki-content-background-color); --wiki-footer-background-opacity: var(--wiki-content-background-opacity); --wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-footer-text-color: var(--wiki-content-text-color); --wiki-footer-link-color: var(--wiki-content-link-color); --wiki-footer-link-color--hover: var(--wiki-content-link-color--hover); --wiki-footer-border-radius: var(--wiki-content-border-radius); --wiki-navigation-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-background-color--hover: var(--wiki-navigation-background-color); --wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity); --wiki-navigation-background-image--hover: var(--wiki-navigation-background-image); --wiki-navigation-background-position--hover: var(--wiki-navigation-background-position); --wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat); --wiki-navigation-background-size--hover: var(--wiki-navigation-background-size); --wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover); --wiki-navigation-transform--hover: none; --wiki-navigation-selected-border-style: solid; --wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-border-style: solid; --wiki-navigation-border-color--hover: var(--wiki-navigation-border-color); --wiki-navigation-border-image--hover: var(--wiki-navigation-border-image); --wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style); --wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)); --wiki-navigation-icon-size: 1em; --wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x); --wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */ --wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color); --wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color); --wiki-navigation-dropdown-offset: 0px; /* vertical offset */ --wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-search-background-image: none; --wiki-navigation-search-background-position: 0; --wiki-navigation-search-background-size: auto; --wiki-navigation-search-background-repeat: repeat; --wiki-navigation-search-backdrop-filter: none; --wiki-navigation-search-border-color: var(--wiki-navigation-border-color); --wiki-navigation-search-border-color--hover: var(--wiki-accent-color); --wiki-navigation-search-border-style: solid; --wiki-navigation-search-border-width: 1px; --wiki-navigation-search-border-radius: 2px; --wiki-navigation-search-border-image: none; --wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image); --wiki-navigation-search-box-shadow: none; --wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow); --wiki-navigation-search-text-color: var(--wiki-content-text-color); --wiki-navigation-search-font-size: var(--wiki-navigation-font-size); --wiki-navigation-search-height: 2em; --wiki-navigation-search-button-color: currentColor; --wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color); --wiki-navigation-search-button-color-opacity: 80%; --wiki-navigation-search-button-color-opacity--hover: 95%; --wiki-navigation-search-bottom-spacing: 3px; --wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); --wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */ } /*** mobile adjustments ***/ @media screen and (max-width: 720px) { body.has-vector-mobile-menu{ --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-margin: 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-margin: 0px 0px -0.5em 0px; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-line-height: 1.125; --wiki-sidebar-background-opacity: 100%; --wiki-navigation-search-border-width: 1px; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; } } /***************************** **** END SHARED VARIABLES **** ******************************/ /****************************************************************************************** ********************************* End user-edit variables ********************************* ******************************************************************************************/ /****************************** * Fallback for older browsers * * DONT EDIT THIS * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .view-dark, .view-light, :root { --wiki-content-text-mix-color: var(--wiki-content-text-color); --wiki-content-text-mix-color-95: var(--wiki-content-background-color); --wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted); --wiki-content-border-color--secondary: var(--wiki-content-border-color); --wiki-content-border-color--accent: var(--wiki-accent-color); --wiki-accent-color--hover: var(--wiki-accent-color); --wiki-navigation-search-highlight-background-color: transparent; } } /***************************** * End older browser fallback * ******************************/ /***************************** * PortableInfoboxes * ******************************/ :root { --pi-background: var(--wiki-content-background-color); --pi-secondary-background: var(--wiki-accent-color); --pi-secondary-background-label: var(--wiki-accent-label-color); --pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent); } .portable-infobox .pi-title, .portable-infobox .pi-header { text-align: center; font-size: 1.5em; background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent); color: var(--pi-secondary-background-label); } .portable-infobox .pi-data, .portable-infobox .pi-group { background: var(--wiki-content-background-color--secondary); } .portable-infobox .pi-image { padding: 8px; } .pi-image-thumbnail { max-width: 100%; } .pi-caption { color: var(--wiki-content-text-mix-color); } .pi-section-navigation .pi-section-tab.pi-section-active, .pi-section-navigation .pi-section-tab.current, .pi-media-collection .pi-tab-link.current { background: var(--pi-secondary-background); color: var(--pi-secondary-background-label); } .pi-collapse > .pi-item:first-child { cursor: pointer; } /* overqualify these to overwrite normal content heading styles */ .mw-body .portable-infobox h2, .mw-body .portable-infobox h3 { border-bottom: 0; font-family: inherit; font-weight: 700; margin: 0; } /***************************** * End PortableInfoboxes * ******************************/ /******************* * Main page layout * ********************/ #mp-container { display: grid; gap: 10px; } @media screen and (max-width: 990px) { /* for mobile screens */ #mp-container { grid-template-areas:var(--main-page-layout--mobile); grid-template-columns:var(--main-page-layout-columns--mobile, 100%); } .mp-box.mp-hide-on-mobile { display: none; } } @media screen and (min-width: 990px) and (max-width: 1350px) { /* for narrow screens, between 990px and 1350px */ #mp-container { grid-template-areas:var(--main-page-layout--tablet); grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr); } .mp-box.mp-hide-on-tablet { display: none; } } @media screen and (min-width: 1350px) { /* for all other screens, 1350px and wider */ #mp-container { grid-template-areas:var(--main-page-layout--desktop); grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr); } .mp-box.mp-hide-on-desktop { display: none; } } .mp-box { position: relative; display: flex; flex-flow: column nowrap; width: 100%; box-sizing: border-box; background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent); border: 1px solid var(--wiki-content-border-color); padding: 0px; } .mp-body { height: 100%; display: flex; padding: 0.5em; flex-flow: column nowrap; } .mp-box.centered-content .mp-body { height: 100%; display: flex; flex-flow: column nowrap; justify-content: space-evenly; } .mp-box.has-floating-image { display: block; } .mp-box.has-floating-image .mp-body { height: unset; display: block; } /* overqualified to override normal heading styles */ .mw-body .mp-box h2 { text-align: center; font-weight: bold; font-family: var(--wiki-content-heading-font-family); overflow: initial; border-bottom: 1px solid var(--wiki-content-border-color); font-size: 150%; margin: 0; padding: 5px 0; color: var(--wiki-content-heading-color); } #mp-box-welcome { text-align: center; position: relative; overflow: hidden; } #mp-box-welcome h2 { font-size: 200%; } #mp-welcome { display: flex; flex-flow: column nowrap; position: relative; height: 100%; z-index: 2; box-sizing: border-box; } #mp-welcome .welcome-subtitle { height: 100%; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); padding: 0.5em; } #mp-banner { position: absolute; width: 100%; height: 100%; filter: blur(5px); z-index: -1; background: url(/images/e/e0/MP_banner.jpg); background-size: cover; background-repeat: no-repeat; background-position: top center; } .view-dark #mp-banner { filter: blur(5px) brightness(50%); } .view-light #mp-banner { filter: blur(5px) contrast(50%); } /* [[Template:MP_link]] */ .mp-links { --gap: 10px; } .mp-links > ul { display: flex; flex-flow: row wrap; justify-content: space-evenly; margin: 2px; gap: var(--gap); } .mp-links > ul > li { display: flex; flex-flow: column nowrap; align-items: stretch; text-align: center; box-sizing: border-box; flex: max(calc(50% - var(--gap)), 5em) 1 1; outline: 1px solid var(--wiki-content-link-color); transition: 0.1s ease-in; } .mp-links > ul > li:hover { background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); } .mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;} .mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;} .mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;} .mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;} .mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;} .mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;} .mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;} .mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;} .mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;} .mp-links > ul > li:hover a { text-decoration: underline; } .mp-links > ul > li > a { display: flex; align-items: center; justify-content: center; height: 100%; flex: 1 1 auto; box-sizing: border-box; padding: 5px; } .mp-links > ul > li > a:first-child { height: 100%; } .mp-links > ul > li > a:last-child:not(:first-child) { height: unset; } .mp-links.stretch, .mp-links.stretch > ul { height: 100%; } .mp-links.side-image li { flex-flow: row nowrap; } .mp-links.plain > ul > li { outline-color: transparent; } /*********************** * End main page layout * ************************/ /********************************************************************************************************************* * Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) * **********************************************************************************************************************/ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: */ .hlist dt:not(:last-child)::after { content: ":\20"; } .hlist dd:not(:last-child)::after, .hlist li:not(:last-child)::after { /* "space, Middle Dot, space" We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters. The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */ /* content: "\20\00B7\20"; font-weight: bold; */ /* "space &nbsp; • &nbsp; space" There may (and likely) be an extra whitespace between <li>s, therefore we have to use a space character as last character of this sequence. By this way, the last space and the next whitespce will collapse as a single space, to make the whitespace on both sides of the middle dot the same width. */ content: "\20\A0\2022\A0\20"; font-weight: inherit; } /* Add parentheses around nested lists */ .hlist dd ol::before, .hlist dd ul::before, .hlist dd dl::before, .hlist dt ol::before, .hlist dt ul::before, .hlist dt dl::before, .hlist li ol::before, .hlist li ul::before, .hlist li dl::before { content: "\20("; font-weight: inherit; } .hlist dd ol::after, .hlist dd ul::after, .hlist dd dl::after, .hlist dt ol::after, .hlist dt ul::after, .hlist dt dl::after, .hlist li ol::after, .hlist li ul::after, .hlist li dl::after { content: ")"; font-weight: inherit; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) ".\20"; } /* Progressive enhancement: * try to make the dot always follow the list item in same line */ .hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) { display: inline-block; } /******************************************** * End semantically-correct horizontal lists * *********************************************/ /*** Miscellaneous ***/ .responsive-image { max-width: 100%; height: auto; } .view-dark .invert-on-dark, .view-light .invert-on-light { filter: invert(100%); } .pixelated { image-rendering: pixelated; } @media screen and (min-width: 720px) { .mobileonly { display: none; } } @media screen and (max-width: 720px) { .nomobile { display: none; } } /*** Utility classes for standard MW galleries ***/ /* it's important that spaced comes before centered in the sheet */ .gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */ display: flex; flex-flow: row wrap; justify-content: space-evenly; margin-left: unset; } .gallery.centered { text-align: center; } /************************** * Start Modular Templates * **************************/ /********* [[Template:Ambox]] *********/ .ambox { --ambox-color: var(--wiki-accent-color); border: 1px solid var(--wiki-content-border-color); border-left: 10px solid var(--ambox-color); border-radius: 2px; display: flex; align-items: center; gap: .6em; margin: 1em 0; padding: 3px .6em; background-color: var(--wiki-content-background-color--secondary); box-shadow: 2px 2px 5px 0px #0002; } @media (min-width: 720px) { .ambox { margin-inline: 10%; } } .ambox.tiny { padding: .04rem .5em; margin-inline: 0; width: fit-content; } .ambox + .ambox { margin-top: -.6em; } .ambox-content { flex: 1; } .ambox-content p { margin: .15em 0; } .ambox-title { font-weight: bold; } /********* [[Template:Hatnote]] *********/ .hatnote { padding: 1px 0 1px 1.6em; margin-bottom: 0.5em; font-style: italic; border-top: 1px solid var(--wiki-content-border-color--secondary); border-bottom: 1px solid var(--wiki-content-border-color--secondary); } .hatnote.icon { padding-left: 0; } /********* [[Template:Spoiler]] *********/ .spoiler-content { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent); transition: all 0.3s; cursor: pointer; overflow: auto; } @supports not (color:color-mix(in srgb, #000, transparent)) { .spoiler-content { background-color: var(--wiki-content-dynamic-color--secondary); } } .spoiler-content > * { pointer-events: none; opacity: 0; transition: all 0.3s; } .spoiler-content.show { background-color: transparent; } .spoiler-content.show > * { pointer-events: unset; opacity: 1; } /********* [[Template:Link icon]] *********/ .link-icon { --link-icon-line-height: 1.5em; --link-icon-size: 1.5em; display: inline-flex; align-items: center; height: var(--link-icon-line-height); vertical-align: bottom; } .link-icon .regular { align-self: center; } .link-icon .regular a { display: flex; } .link-icon .regular img { height: var(--link-icon-size); max-width: var(--link-icon-size); } .link-icon .fallback { outline: 1px solid var(--wiki-content-text-color); border-radius: 50%; text-align: center; width: var(--link-icon-size); line-height: var(--link-icon-size); } .link-icon.notext, .link-icon.notext .fallback { display: inline-block; } /********* [[Template:Quote]] *********/ .quote { background: var(--wiki-content-background-color--secondary); border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: .5em 0; padding: .5em; overflow-y: hidden; } .quote .block { display: block; } .quote .title { font-size: large; font-weight: bold; } .quote .content { font-style: italic; } .quote .author { font-weight: bold; text-align: end; } .quote .marks-wrapper { display: flex; gap: 5px; } .quote .marks-wrapper::before, .quote .marks-wrapper::after { font-size: 100px; line-height: 0px; } .quote .marks-wrapper::before { content: "\201C"; margin-top: 40px; } .quote .marks-wrapper::after { content: "\201D"; align-self: end; margin-bottom: -10px; } .client-js .mw-charinsert-item { display: none; } /************************ * End Modular Templates * *************************/ /***************************** * Used by [[Template:Color]] * ******************************/ .color__splotch { display: inline-block; height: 1em; width: 1em; box-sizing: border-box; vertical-align: text-top; border-radius: 50%; border: 1px solid var(--wiki-content-text-color); } /********************* * End Template:Color * **********************/ /********************************* * Used by [[Template:TOC limit]] * **********************************/ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /************************* * End Template:TOC limit * **************************/ /********************************* * Used by [[Template:TOC right]] * **********************************/ @media all and (min-width: 720px) { .tocright { float: right; clear: right; margin: 0 0 0.5em 1em; } } /************************* * End Template:TOC right * **************************/ 40bfba1f9ff64946e8ca2054b3ba281f00f40f54 MediaWiki:Theme-definitions 8 236 260 2025-08-20T01:24:56Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki * light[bundled|kind=light] * dark[bundled|kind=dark] 05cdfdf87ea42919cc6ea267d3972cc06847ed60 MediaWiki:Gadgets/purge/main.js 8 237 261 2025-08-20T01:24:57Z ARTIFICER 564804 Importing default loadout javascript text/javascript $.when( $.ready ) .then(function(){ if ( document.getElementById( 'ca-cargo-purge' )){ return; } // disable if Cargo has already added a purge button if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) { return; } // disable on special pages var url = new URL(window.location.href); url.searchParams.set('action', 'purge'); var button = mw.util.addPortletLink('p-cactions', url.href, mw.msg('cargo-purgecache'), 'ca-gadget-purgecache', mw.msg('action-purge'), '1'); button.addEventListener('click', (function(event) { event.preventDefault(); var api = new mw.Api(); api.post({ action: 'purge', titles: mw.config.get('wgPageName'), forcerecursivelinkupdate: true }).then(function() { window.location.reload(true); }).fail(function(code) { mw.notify(mw.msg('cargo-purgecache-failed')+" "+code); }); })); }); 5d10082771b97fa1ba479534a973769321d887dc MediaWiki:Gadgets/userProfile/main.js 8 238 262 2025-08-20T01:24:58Z ARTIFICER 564804 Importing default loadout javascript text/javascript // User profile // <nowiki> mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).done( function() { var config = mw.config.get( [ 'wgRelevantUserName', 'wgNamespaceNumber', 'wgUserLanguage', 'wgArticleId', 'wgAction', 'wgTitle' ] ); var username = config.wgRelevantUserName; if ( !username || window.loadedHorseUserProfile ) return; window.loadedHorseUserProfile = true; if ( config.wgNamespaceNumber !== -1 && config.wgTitle.includes('/') ) return; var lang = mw.language.bcp47(config.wgUserLanguage); var dateOptions = { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", timeZone: "UTC", timeZoneName: "short" }; var api = new mw.Api(); if ( mw.util.isIPAddress(username) ) api.get( { action: 'query', list: ['usercontribs', 'blocks'], ucuser: username, ucprop: [], uclimit: 'max', bkip: username, bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'], bklimit: 1, formatversion: 2 } ).done( function(data) { var editcount = data.query.usercontribs.length; if ( data.continue && data.continue.uccontinue ) editcount = data.limits.usercontribs+'+'; var user = { groups: ['*'], editcount: editcount }; formatProfile(user, data.query.blocks[0]); } ); else api.get( { action: 'query', list: ['users', 'blocks'], ususers: username, usprop: ['groups', 'editcount', 'registration', 'emailable'], bkusers: username, bkprop: ['user', 'by', 'timestamp', 'expiry', 'flags', 'reason', 'restrictions'], bklimit: 1, formatversion: 2 } ).done( function(data) { formatProfile(data.query.users[0], data.query.blocks[0]); } ); if ( window.loadedHorseUserProfileContribs ) return; window.loadedHorseUserProfileContribs = true; if ( config.wgNamespaceNumber === 2 && !config.wgArticleId && config.wgAction === 'view' ) { mw.loader.using( [ 'mediawiki.pager.styles', 'mediawiki.special.changeslist' ] ).then( function() { var text = '== [[Special:Contributions/' + username + '|{{int:contributions-title|' + username + '}}]] ==\n{{Special:Contributions/' + username + '|limit=20}}'; new mw.Api().parse( text, { title: 'User:' + config.wgTitle, wrapoutputclass: 'horse-userprofile-contribs', disableeditsection: true, disablelimitreport: true, uselang: config.wgUserLanguage } ).done( function(parsedText) { mw.hook( 'wikipage.content' ).fire( $( parsedText ).appendTo('#mw-content-text') ); } ); } ); } function formatProfile(user, block) { user.groups.splice(user.groups.indexOf('*'), 1); var text = '<div class="horse-userprofile-info">'; if ( user.groups.length ) { var groupList = user.groups.map( function(group) { var grouppage = '{{MediaWiki:grouppage-'+group+'}}'; return [ '{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'}}]] | {{int:group-'+group+'}} }}', '{{#ifexist: '+grouppage+' | [['+grouppage+'|{{int:group-'+group+'-member|'+username+'}}]] | {{int:group-'+group+'-member|'+username+'}} }}' ]; } ).reduce( function(prev, cur) { prev[0].push(cur[0]); prev[1].push(cur[1]); return prev; }, [[], []] ); text += '\n\n<span>{{int:prefs-memberingroups|'+user.groups.length+'|'+username+'}}</span>\t<span>{{int:prefs-memberingroups-type|'+mw.language.listToText(groupList[0])+'|'+mw.language.listToText(groupList[1])+'}}</span>'; if (mw.config.get('wgUserGroups').some(item => ['advocate', 'staff'].includes(item))) { //return true if their usergroups contain advocate or staff text += '<br/>([[Special:UserRights/' + username + '|{{int:tool-link-userrights|' + username + '}}]])' } } text += '\n\n<span>{{int:prefs-edits}}</span>\t<span>[[Special:Contribs/'+username+'|'+mw.language.convertNumber(user.editcount)+']]</span>'; if ( user.registration ) text += '\n\n<span>{{int:prefs-registration}}</span>\t<span>'+mw.language.convertNumber(new Date(user.registration).toLocaleString(lang, dateOptions))+'</span>'; if ( user.userid && !user.emailable ) text += '\n\n<span>{{int:nowikiemailtext|'+username+'}}</span>'; text += '\n\n</div>'; if ( block && !$('.mw-warning-with-logexcerpt .mw-logevent-loglines > .mw-logline-block').length ) { var notice = 'sp-contributions-blocked-notice'; if ( mw.util.isIPAddress(block.user, true) ) notice += '-anon'; var logentry = 'logentry-block-block'; var partialBlock = []; if ( block.partial ) { notice += '-partial'; logentry = 'logentry-partialblock-block'; if ( block.restrictions.pages ) { var blockpages = block.restrictions.pages.map( function(page) { return '[['+page.title+']]'; } ); partialBlock.push('{{int:logentry-partialblock-block-page|'+blockpages.length+'|'+mw.language.listToText(blockpages)+'}}'); } if ( block.restrictions.namespaces ) { var blocknamespaces = block.restrictions.namespaces.map( function(namespace) { if ( !namespace ) return '[[Special:AllPages|{{int:blanknamespace}}]]'; return '[[Special:AllPages/{{ns:'+namespace+'}}:|{{ns:'+namespace+'}}]]'; } ); partialBlock.push('{{int:logentry-partialblock-block-ns|'+blocknamespaces.length+'|'+mw.language.listToText(blocknamespaces)+'}}'); } if ( block.restrictions.actions ) { var blockactions = block.restrictions.actions.map( function(action) { return '{{int:ipb-action-'+action+'}}'; } ); partialBlock.push('{{int:logentry-partialblock-block-action|'+blockactions.length+'|'+mw.language.listToText(blockactions)+'}}'); } if ( !partialBlock.length ) logentry = 'logentry-non-editing-block-block'; } var blockDate = new Date(block.timestamp); var blockexpiry = '{{int:infiniteblock}}'; if ( !['infinite', 'indefinite', 'infinity', 'never'].includes(block.expiry) ) { var expiry = new Date(block.expiry.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2,3})/, '$1-$2-$3T$4:$5:$6Z' )); var duration = expiry - blockDate; var blockDuration = []; var factor = 1000; if ( duration % factor === 0 ) blockDuration = ['duration-seconds', Math.floor(duration / factor)]; factor *= 60; if ( duration % factor === 0 ) blockDuration = ['duration-minutes', Math.floor(duration / factor)]; factor *= 60; if ( duration % factor === 0 ) blockDuration = ['duration-hours', Math.floor(duration / factor)]; factor *= 24; if ( duration % factor === 0 ) blockDuration = ['duration-days', Math.floor(duration / factor)]; if ( duration % (factor*7) === 0 ) blockDuration = ['duration-weeks', Math.floor(duration / (factor*7))]; if ( duration % (factor*30) === 0 ) blockDuration = ['months', Math.floor(duration / (factor*30))]; factor *= 365; if ( duration % factor === 0 ) blockDuration = ['duration-years', Math.floor(duration / factor)]; if ( duration % (factor*10) === 0 ) blockDuration = ['duration-decades', Math.floor(duration / (factor*10))]; if ( duration % (factor*100) === 0 ) blockDuration = ['duration-centuries', Math.floor(duration / (factor*100))]; if ( duration % (factor*1000) === 0 ) blockDuration = ['duration-millennia', Math.floor(duration / (factor*1000))]; if ( blockDuration.length < 2 || blockDuration[1] > 1000 ) blockexpiry = mw.language.convertNumber(expiry.toLocaleString(lang, dateOptions)); else blockexpiry = '{{int:'+blockDuration.join('|')+'}}'; } var blockflags = ''; var blockflaglist = []; if ( block.anononly ) blockflaglist.push('{{int:block-log-flags-anononly}}'); if ( block.nocreate ) blockflaglist.push('{{int:block-log-flags-nocreate}}'); if ( !block.autoblock && !mw.util.isIPAddress(block.user, true) ) blockflaglist.push('{{int:block-log-flags-noautoblock}}'); if ( !block.allowusertalk ) blockflaglist.push('{{int:block-log-flags-nousertalk}}'); if ( block.noemail ) blockflaglist.push('{{int:block-log-flags-noemail}}'); if ( block.hidden ) blockflaglist.push('{{int:block-log-flags-hiddenname}}'); if ( blockflaglist.length ) blockflags = '{{int:parentheses|'+blockflaglist.join(mw.msg('comma-separator'))+'}}'; var blockreason = ' <span class="comment">{{int:parentheses|'+block.reason+'}}</span>'; if ( !block.reason ) blockreason = ''; text += '<div class="horse-userprofile-block cdx-message cdx-message--block cdx-message--warning mw-warning-with-logexcerpt"><span class="cdx-message__icon"></span><div class="cdx-message__content">\n{{int:'+notice+'|'+username+'}}\n'; text += '<ul class="mw-logevent-loglines"><li class="mw-logline-block">'+mw.language.convertNumber(blockDate.toLocaleString(lang, dateOptions))+' {{int:'+logentry+'|[[User:'+block.by+'|'+block.by+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.by+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.by+'|{{int:contribslink}}]]</span></span>|'+block.by; if ( mw.util.isIPAddress(block.user, true) ) text += '|[[Special:Contribs/'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span></span>'; else text += '|[[User:'+block.user+'|'+block.user+']] <span class="mw-usertoollinks mw-changeslist-links"><span>[[User talk:'+block.user+'|{{int:talkpagelinktext}}]]</span> <span>[[Special:Contribs/'+block.user+'|{{int:contribslink}}]]</span></span>'; text += '|'+block.user+'|'+blockexpiry+'|'+blockflags+'|'+mw.language.listToText(partialBlock)+'}}'+blockreason+'</li></ul></div></div>'; } api.parse( '<div class="cdx-message__content">' + text + '</div>', { disablelimitreport: true, wrapoutputclass: 'horse-userprofile mw-message-box cdx-message mw-content-'+($('#mw-content-subtitle').attr('dir')||'ltr'), uselang: config.wgUserLanguage } ).done( function(parsedText) { parsedText = parsedText.replace( /\u29FCgroup-([^\u29FC\u29FD]+?)(?:-member)?\u29FD/g, '$1' ); mw.hook( 'wikipage.content' ).fire( $( parsedText ).appendTo('#contentSub') ); } ); } } ); // </nowiki> a86531394e21271ad91869b48f3634f341b1bd79 MediaWiki:Gadgets/userProfile/main.css 8 239 263 2025-08-20T01:24:58Z ARTIFICER 564804 Importing default loadout css text/css #contentSub > * + .horse-userprofile { margin-top: 1em; } .horse-userprofile { font-size: 120%; color: var(--wiki-content-text-color); border: 2px solid var(--wiki-content-border-color); padding: 6px 12px; } .horse-userprofile-info span:first-of-type { font-weight: bold; } 1729445bb17e2974426befaf9bd441ab4bf189c5 MediaWiki:Gadgets/uploadMultipleFiles/main.js 8 240 264 2025-08-20T01:24:59Z ARTIFICER 564804 Importing default loadout javascript text/javascript /* Modified version of https://dev.fandom.com/wiki/UploadMultipleFiles * from https://terraria.wiki.gg/wiki/MediaWiki:Gadget-uploadMultipleFiles.js */ $.when( mw.loader.using( ['site', 'mediawiki.util', 'mediawiki.api', 'mediawiki.jqueryMsg'] ), $.ready ) .then( () => new mw.Api().loadMessagesIfMissing([ 'gadget-uploadMultipleFiles-multiupload', 'gadget-uploadMultipleFiles-yes', 'gadget-uploadMultipleFiles-no', 'gadget-uploadMultipleFiles-sourcefiles', 'gadget-uploadMultipleFiles-categoryname', 'gadget-uploadMultipleFiles-categorynamehint', 'gadget-uploadMultipleFiles-categorynamespace', 'gadget-uploadMultipleFiles-uploadfiles', 'gadget-uploadMultipleFiles-nofiles', 'gadget-uploadMultipleFiles-nolicense', 'gadget-uploadMultipleFiles-summary', 'gadget-uploadMultipleFiles-license', 'gadget-uploadMultipleFiles-categories', 'gadget-uploadMultipleFiles-uploading', 'gadget-uploadMultipleFiles-uploaded', 'gadget-uploadMultipleFiles-failed', 'gadget-uploadMultipleFiles-done', 'gadget-uploadMultipleFiles-ratelimited', ]) ) .then(function(){ if (mw.config.get("wgCanonicalSpecialPageName") !== "Upload"){ return; } if (window.__wgg_UploadMultipleFiles_IsLoaded) { return; } window.__wgg_UploadMultipleFiles_IsLoaded = true; const getUploadDescription = function() { var sections = []; var summary = $("#wpUploadDescription").val(); var licenseDisplayName = $("#wpLicense option:selected").val(); var categoryName = $("#multiFileCategory").val(); if (summary !== ""){ sections.push(summary); } if (licenseDisplayName !== "") { var licenseTemplateText = $("#wpLicense option:selected").prop("title"); sections.push("== " + mw.msg("gadget-uploadMultipleFiles-license") + " ==\n" + licenseTemplateText); } if (categoryName !== "") sections.push("[[" + mw.msg("gadget-uploadMultipleFiles-categorynamespace") + ":" + categoryName + "]]"); return sections.join("\n\n"); }; const getWatchlistPreference = function() { if ($("#wpWatchthis").is(":checked")) { return "watch"; } else { return "nochange"; } }; $("#wpUploadFile").parent().parent().addClass("regularFileSelect"); $("tr.regularFileSelect").before( $("<tr></tr>").append( $('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-multiupload"), $('<td class="mw-input"></td>').append( $("<label></label>").msg("gadget-uploadMultipleFiles-yes").prepend('<input type="radio" name="multipleFiles" value="yes" /> '), ' &nbsp; ', $("<label></label>").msg("gadget-uploadMultipleFiles-no" ).prepend('<input type="radio" name="multipleFiles" value="no" checked/> '), ) ) ).after( $('<tr class="multipleFileSelect" style="display:none;"></tr>').append( $('<td class="mw-label"></td>').msg("gadget-uploadMultipleFiles-sourcefiles"), $('<td class="mw-input"></td>').append('<input type="file" id="multiupload" multiple />') ) ); $("input[name='wpUpload']").addClass("regularFileSelect"); $("#wpDestFile").parent().parent().addClass("regularFileSelect"); $("#wpIgnoreWarning").parent().parent().addClass("regularFileSelect"); // Append "category name" textbox to multiupload section $("#mw-upload-form #mw-htmlform-description tbody").append( $('<tr class="mw-htmlform-field-HTMLTextField multipleFileSelect" style="display:none;"></tr>').append( $('<td class="mw-label"></td>').append('<label for="multiFileCategory"><abbr title="' + mw.msg("gadget-uploadMultipleFiles-categorynamehint") + '">' + mw.msg("gadget-uploadMultipleFiles-categoryname") + '</abbr></label>'), $('<td class="mw-input"></td>').append('<input id="multiFileCategory" name="multiFileCategory" size="60">') ) ); $("input[name='wpUpload']").after('<input type="button" value="' + mw.msg("gadget-uploadMultipleFiles-uploadfiles") + '" class="multipleFileSelect" style="display:none;" id="multiFileSubmit" />'); $("input[name='multipleFiles']").change(function() { if (this.value === 'yes') { $(".regularFileSelect").hide(); $(".multipleFileSelect").show(); } else { $(".regularFileSelect").show(); $(".multipleFileSelect").hide(); } }); $("#multiFileSubmit").click(function() { var files = $("#multiupload")[0].files; // Cancel upload if no files are selected if (files.length === 0) { alert(mw.msg("gadget-uploadMultipleFiles-nofiles")); return false; } // Cancel upload if no license is selected if ($("#wpLicense option:selected").val() === "" && !mw.config.get("UMFBypassLicenseCheck")) { alert(mw.msg("gadget-uploadMultipleFiles-nolicense")); return false; } // Description is summary + license + category var description = getUploadDescription(); var watch = getWatchlistPreference(); $("#firstHeading").msg("gadget-uploadMultipleFiles-uploading"); $("#mw-content-text").html("<h3>" + mw.msg("gadget-uploadMultipleFiles-uploaded") + "</h3><ul></ul><div style='display:none;' id='multiUploadFailed'><h3>" + mw.msg("gadget-uploadMultipleFiles-failed") + "</h3><ul></ul></div>"); var currentFileIdx = 0; var uploadCurrentFile; uploadCurrentFile = function() { if (currentFileIdx > files.length) { $("#mw-content-text").append($("<h3></h3>").msg("gadget-uploadMultipleFiles-done")); return; } if (files[currentFileIdx] === undefined) { currentFileIdx++; uploadCurrentFile(); return; } fd = new FormData(); fd.append("action", "upload"); fd.append("token", mw.user.tokens.get("csrfToken")); fd.append("filename", files[currentFileIdx].name); fd.append("file", files[currentFileIdx]); fd.append("text", description); fd.append("watchlist", watch); fd.append("ignorewarnings", 1); fd.append("format", "json"); const $output = $("#mw-content-text > ul"); const $failed = $("#multiUploadFailed"); const $failedOutput = $('#multiUploadFailed ul'); $.ajax({ url: mw.util.wikiScript("api"), method: "POST", data: fd, cache: false, contentType: false, processData: false, type: "POST" }).done(function(d) { if (d.error == undefined) { $output.append('<li><a href="' + d.upload.imageinfo.descriptionurl + '" target="_blank">' + d.upload.filename + '</a></li>'); } // specific catch for ratelimiting else if(d.error.code === "ratelimited") { timer = 60; console.log(mw.msg('gadget-uploadMultipleFiles-ratelimited', timer)); $message = $('<li class="multiUploadActive"></li>').msg('gadget-uploadMultipleFiles-ratelimited', $('<span id="rateLimitCounter">' + timer + '</span>')); $output.append($message); var countdown = setInterval(function(){ // count the timer down, and remove at 0 timer -= 1; document.getElementById('rateLimitCounter').textContent = timer; if (timer <= 0) { $message.remove() clearInterval(countdown); } }, 1000); setTimeout(function(){ // redundant clearing of the interval and message in case of race conditions clearInterval(countdown); $message.remove(); uploadCurrentFile(); }, timer * 1000); return; } // generic fallback else { $failedOutput.append('<li>' + files[currentFileIdx].name + ': ' + d.error.info + '</li>'); $failed.show(); } currentFileIdx++; uploadCurrentFile(); }).fail(function() { $failedOutput.append('<li>' + files[currentFileIdx].name + '</li>'); $failed.show(); currentFileIdx++; uploadCurrentFile(); }); }; uploadCurrentFile(); }); }); f47e56dc31399578758f15aafbdf732564a80bd3 MediaWiki:Licenses 8 241 265 2025-08-20T01:25:00Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki *Game content ** License|game|This contains content from the game or its official media *Commonly used ** License|fairuse|This will be used in a way that qualifies as "fair use" under US law ** License|CC0|This file is licensed under the CC0 1.0 License ** License|CC-BY-NC-ND|This is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License ** License|CC-BY-NC-SA|This is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License ** License|CC-BY-NC|This is licensed under the Creative Commons Attribution-NonCommercial 3.0 License ** License|CC-BY-ND|This is licensed under the Creative Commons Attribution-NoDerivs 3.0 License ** License|CC-BY-SA|This is licensed under the Creative Commons Attribution-ShareAlike 3.0 License ** License|permission|The copyright holder gave permission to use this work only in wiki.gg articles ** License|CC-BY|This is licensed under the Creative Commons Attribution 3.0 License ** License|CC-PD|This is in the public domain ** License|CC-SRR|This is licensed under the Creative Commons Some Rights Reserved License *Unsure or unknown ** License|nolicense|I don't know the license 80cf31331a258a3fc3651f6d5961fbb5c1822cee MediaWiki:Copyright 8 242 266 2025-08-20T01:25:01Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{int:wikigg-copyright|CC BY-SA 4.0|$1}} 999f12b472b0177c515e14cda21d5e4ddc0603e1 MediaWiki:Mainpage 8 243 267 2025-08-20T01:25:02Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki {{SITENAME}} 3879910e8b355a24373fd09ccc909145b2639907 MediaWiki:Apioutput.css 8 244 268 2025-08-20T01:25:02Z ARTIFICER 564804 Importing default loadout css text/css /* All CSS here is applied on api.php pages */ @media (prefers-color-scheme: dark) { body { background-color:#20211f; border-color: #7b7261; color: #f6ecdb; } h1, h2, h3, h4, h5, h6 { color: rgb(234, 224, 207); border-color: rgb(83, 84, 81); } .mw-highlight .s2 { color: rgb(206, 99, 91); } a { color: rgb(133, 180, 221); } a:visited { color: rgb(141, 127, 218); } pre, code, .mw-code { background-color: rgb(34, 35, 33); color: rgb(234, 224, 207); border-color: rgb(63, 64, 62); } } c95cf2c22c12d821f22b745f2aa78d4f6f711500 MediaWiki:Gadgets/hoverShowSpoilers/main.css 8 245 269 2025-08-20T01:25:03Z ARTIFICER 564804 Importing default loadout css text/css .spoiler-content:hover > * { pointer-events:unset; opacity: 1; } .spoiler-content:hover { background-color: transparent; } 1c73aafcb749d7e0e9107c1045310d2af70aae7e MediaWiki:Common.css/doc 8 246 270 2025-08-20T01:25:03Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <div class="mw-parser-output" id="dl-variable-doc"><!-- hide this in your global.css if you're familiar with how default loadout works and this documentation is just in your way --> <h2>Documentation</h2> This wiki is using the theming template from the [[dlw:|default loadout]]. This template is intended to minimize the work required to create a custom colored version of the standard [[mw:Skin:Vector|Vector]] skin, while maximizing the various nooks and crannies that those colors reach, all while keeping everything legible and matching. Please be aware of the [[support:Customization policy|customization policy]] when modifying the theme. <h3>Themes</h3> The [[support:Theme Toggle|Theme Toggle]] extension is installed, and allows multiple themes to be used. In the actual stylesheet below this documentation, you'll find two huge rules at the top, each containing lots of [https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties CSS color variables]. They look like this: <syntaxhighlight lang=css> :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); /* and so on */ } .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); /* and so on */ } </syntaxhighlight> These are the standard light and dark themes, defined in [[Mediawiki:Theme-definitions]]. '''Important''': if you want your wiki to only support a single theme, edit that page and remove the line you don't want (don't remove both). The <code>:root</code> selector is a fallback, meaning that in case something happens and Theme Toggle fails to work, the following theme will still mostly work. If you have multiple themes, you can move the <code>:root</code> rule to whichever you'd consider the "default" theme. <h3>Non-color variables</h3> {| class="wikitable" ! Variable name !! Notes |- | --wiki-body-background-image | This is the image path to the wiki's background image. Usually this is uploaded to File:Site-background.jpg, File:Site-background-light.jpg, and/or File:Site-background-dark.jpg. While there's not a hard file size limit, it is recommended that this not exceed 250 KB. File size can be reduced by resizing (anything over 2560x1440p is excessive), converting to a jpg, and compressed using sites like [https://tinypng.com TinyPNG]. |- | --wiki-body-background-position | The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-position background-position] of the background image. Usually this is set to <code>top center</code>. |- | --wiki-body-background-size | The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-size background-size] of the background image. Usually this is set to <code>cover</code>. |- | --wiki-body-background-repeat | The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-repeat background-repeat] of the background image. Usually this is set to <code>no-repeat</code>. |- | --wiki-body-background-attachment | The [https://developer.mozilla.org/en-US/docs/Web/CSS/background-attachment background-attachment] of the background image. Usually this is set to <code>fixed</code>. |- | --wiki-body-font-family | The font family of most of the wiki, such as the sidebar, navigation, and content text. Usually this is sans-serif. If modifying this, use a simple font that is easy to read. See <code>--wiki-heading-font-family</code> if you want to incorporate a more decorative font into the theme. |- | --wiki-heading-font-family | The font family of headings, such as the page title and section headings. This font is usually displayed in a larger size, so it's safer to use a more decorative font than <code>--wiki-body-font-family</code>, but still try to keep it legible. |- | --wiki-sidebar-heading-font-family | The font family of sidebar headings. In contrast to <code>--wiki-heading-font-family</code>, this is usually displayed in a smaller size, so keep it simple and easy to read. |- | --wiki-sidebar-border-radius | The [https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius border-radius] of the sidebar. If <code>--wiki-sidebar-portal-spacing</code> is set to 0, then only the top and bottom corners of the sidebar as a whole will be affected, otherwise every portal will have all its corners affected. Units must be specified even if this is set to 0. |- | --wiki-sidebar-portal-spacing | The space between each portal in the sidebar. Units must be specified even if this is set to 0. |- | --wiki-content-border-width | The thickness of the border around the content area. |- | --wiki-sidebar-border-width | The thickness of the border around the sidebar portals. |- | --wiki-content-background-opacity | The opacity of the main content area, to let the wiki's background image show through. Please keep this high, usually above 90%, or it can make reading text difficult. |- | --wiki-sidebar-background-opacity | The background opacity of the sidebar. Usually this inherits <code>--wiki-content-background-opacity</code>. |- | --wiki-icon-general-filter | A filter applied to many icons to make them visible on dark themes. Usually this is just <code>invert(100%)</code> on dark themes and blank on light themes. |- | --wiki-icon-to-link-filter | A filter that converts many icons into the same color as <code>--wiki-content-link-color</code>. This can be generated by plugging that into https://mrpie5.gitlab.io/css-filter-generator/. |} <h3>List of all colors with contrast checking</h3> The table below shows all the colors currently in use, as well as notes on how to use them. The last column shows which colors are expected to show up as text against other colors. With the exception of <code>--wiki-content-text-mix-color-95</code>, all text in the last column should be ''clearly'' legible. If it is not, you may need to adjust one of the referenced colors in your color palette. Keep in mind that changes to the opacity variables in the section above will cause the content and sidebar background colors to mix with the body background color/image, so the contrasts below may not be perfectly accurate. {| class="wikitable" ! Variable name !! Color !! style="width: 40em;" | Notes !! Test contrast against these variables |- | --wiki-body-background-color | style="background-color:var(--wiki-body-background-color);" | | The background color behind the background image. This usually only shows up if the background image doesn't load, doesn't fill the screen, or has some transparency. This color should be similar to the overall color of the background image, or the top-left corner if it is made up of many different colors. In the former case, https://matkl.github.io/average-color/ is helpful. | style="background-color:var(--wiki-body-background-color);" | <span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/> <span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/> |- | --wiki-body-dynamic-color | style="background-color:var(--wiki-body-dynamic-color);" | | This is expected to contrast sharply with the body-background-color, for cases when text needs to be displayed against it. Usually this is {{color|#000}} on light themes and {{color|#fff}} on dark themes. | style="background-color:var(--wiki-body-dynamic-color);" | <span style="color:var(--wiki-body-background-color)">--wiki-body-background-color</span><br/> <span style="color:var(--wiki-body-dynamic-color--inverted);">--wiki-body-dynamic-color--inverted</span><br/> <span style="color:var(--wiki-body-dynamic-color--secondary--inverted);">--wiki-body-dynamic-color--secondary--inverted</span><br/> |- | --wiki-body-dynamic-color--inverted | style="background-color:var(--wiki-body-dynamic-color--inverted);" | | The inverse of <code>--wiki-body-dynamic-color</code>. This should optimally have almost no contrast with the body-background-color. | style="background-color:var(--wiki-body-dynamic-color--inverted);" | <span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/> <span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/> |- | --wiki-body-dynamic-color--secondary | style="background-color:var(--wiki-body-dynamic-color--secondary);" | | A slightly different version of body-dynamic-color. Usually this is {{color|#333}} on light themes and {{color|#ccc}} on dark themes. | style="background-color:var(--wiki-body-dynamic-color--secondary);" | <span style="color:var(--wiki-body-background-color)">--wiki-body-background-color</span><br/> <span style="color:var(--wiki-body-dynamic-color--inverted);">--wiki-body-dynamic-color--inverted</span><br/> <span style="color:var(--wiki-body-dynamic-color--secondary--inverted);">--wiki-body-dynamic-color--secondary--inverted</span><br/> |- | --wiki-body-dynamic-color--secondary--inverted | style="background-color:var(--wiki-body-dynamic-color--secondary--inverted);" | | The inverse of <code>--wiki-body-dynamic-color--secondary</code>. | style="background-color:var(--wiki-body-dynamic-color--secondary--inverted);" | <span style="color:var(--wiki-body-dynamic-color);">--wiki-body-dynamic-color</span><br/> <span style="color:var(--wiki-body-dynamic-color--secondary);">--wiki-body-dynamic-color--secondary</span><br/> |- | --wiki-content-background-color | style="background-color:var(--wiki-content-background-color);" | | The background color of the main content area. | style="background-color:var(--wiki-content-background-color);" | <span style="color:var(--wiki-content-text-color)">--wiki-content-text-color</span><br/> <span style="color:var(--wiki-content-link-color)">--wiki-content-link-color</span><br/> <span style="color:var(--wiki-content-link-color--visited)">--wiki-content-link-color--visited</span><br/> <span style="color:var(--wiki-content-link-color--hover)">--wiki-content-link-color--hover</span><br/> <span style="color:var(--wiki-content-redlink-color)">--wiki-content-redlink-color</span><br/> <span style="color:var(--wiki-content-text-mix-color)">--wiki-content-text-mix-color</span><br/> <span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/> <span style="color:var(--wiki-content-heading-color)">--wiki-content-heading-color</span><br/> <span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/> <span style="color:var(--wiki-neutral-color)">--wiki-neutral-color</span><br/> <span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/> <span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/> |- | --wiki-content-background-color--secondary | style="background-color:var(--wiki-content-background-color--secondary);" | | A secondary content background to highlight certain things. Usually this is <code>--wiki-content-background-color</code> with saturation and/or value reduced or increased by about 10%, but you're free to make it whatever you want provided the contrast checks to the right still pass. | style="background-color:var(--wiki-content-background-color--secondary);" | <span style="color:var(--wiki-content-text-color)">--wiki-content-text-color</span><br/> <span style="color:var(--wiki-content-link-color)">--wiki-content-link-color</span><br/> <span style="color:var(--wiki-content-link-color--visited)">--wiki-content-link-color--visited</span><br/> <span style="color:var(--wiki-content-link-color--hover)">--wiki-content-link-color--hover</span><br/> <span style="color:var(--wiki-content-redlink-color)">--wiki-content-redlink-color</span><br/> <span style="color:var(--wiki-content-text-mix-color)">--wiki-content-text-mix-color</span><br/> <span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/> <span style="color:var(--wiki-content-heading-color)">--wiki-content-heading-color</span><br/> <span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/> <span style="color:var(--wiki-neutral-color)">--wiki-neutral-color</span><br/> <span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/> <span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/> |- | --wiki-content-border-color | style="background-color:var(--wiki-content-border-color);" | | Border color for the main content area and elements within it. | N/A |- | --wiki-content-border-color--secondary | style="background-color:var(--wiki-content-border-color--secondary);" | | A secondary content border color for elements that do not need to stand out as much. Usually this is <code>--wiki-content-border-color</code> with 50% transparency, but it can be adjusted or made identical if it is too subtle. | N/A |- | --wiki-content-border-color--accent | style="background-color:var(--wiki-content-border-color--accent);" | | A border color that is used as an accent. Usually this is <code>--wiki-accent-color</code> with 50% transparency, but it can be any variation of the accent color. | N/A |- | --wiki-content-text-color | style="background-color:var(--wiki-content-text-color);" | | Text color for the main content area. | style="background-color:var(--wiki-content-text-color);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/> |- | --wiki-content-link-color | style="background-color:var(--wiki-content-link-color);" | | Links within the content area. Please do not make this red, as red links on wikis traditionally denote pages that don't exist. | style="background-color:var(--wiki-content-link-color);" | <span style="color:var(--wiki-content-link-label-color);">--wiki-content-link-label-color</span> |- | --wiki-content-link-label-color | style="background-color:var(--wiki-content-link-label-color);" | | This is used when placing text on an element with the link color as a background, such as a button. | style="background-color:var(--wiki-content-link-label-color);" | <span style="color:var(--wiki-content-link-color);">--wiki-content-link-color</span> |- | --wiki-content-link-color--visited | style="background-color:var(--wiki-content-link-color--visited);" | | The color of visited links. This is optional, and usually inherits <code>--wiki-content-link-color</code>. | style="background-color:var(--wiki-content-link-color--visited);" | <span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span> |- | --wiki-content-link-color--hover | style="background-color:var(--wiki-content-link-color--hover);" | | The color links change to when hovered over. This is optional, and usually inherits <code>--wiki-content-link-color</code>. | style="background-color:var(--wiki-content-link-color--hover);" | <span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span> |- | --wiki-content-redlink-color | style="background-color:var(--wiki-content-redlink-color);" | | The color of links to pages that don't exist. Since these should only rarely be seen, you can be a little lax about choosing a color that contrasts with the background, but it should still be legible. | style="background-color:var(--wiki-content-redlink-color);" | <span style="color:var(--wiki-content-background-color);">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary);">--wiki-content-background-color--secondary</span> |- | --wiki-content-text-mix-color | style="background-color:var(--wiki-content-text-mix-color);" | | A mix of <code>--wiki-content-text-color</code> and <code>--wiki-content-background-color</code>, calculated automatically. This is generally used to mark disabled elements or placeholder text. | style="background-color:var(--wiki-content-text-mix-color);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/> <span style="color:var(--wiki-content-text-mix-color-95)">--wiki-content-text-mix-color-95</span> |- | --wiki-content-text-mix-color-95 | style="background-color:var(--wiki-content-text-mix-color-95);" | | The same as <code>--wiki-content-text-mix-color</code>, but the mix is 95% <code>--wiki-content-background-color</code>, calculated automatically. This is used to mark disabled elements. The contrast checker to the right should actually be very hard to read but not impossible. | style="background-color:var(--wiki-content-text-mix-color-95);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span> |- | --wiki-content-dynamic-color | style="background-color:var(--wiki-content-dynamic-color);" | | This is expected to contrast sharply with <code>--wiki-content-background-color</code>. Usually this is {{color|#000}} on light themes and {{color|#fff}} on dark themes. | style="background-color:var(--wiki-content-dynamic-color);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--inverted)">--wiki-content-dynamic-color--inverted</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary--inverted)">--wiki-content-dynamic-color--secondary--inverted</span><br/> |- | --wiki-content-dynamic-color--inverted | style="background-color:var(--wiki-content-dynamic-color--inverted);" | | The inverse of <code>--wiki-content-dynamic-color</code>. | style="background-color:var(--wiki-content-dynamic-color--inverted);" | <span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/> |- | --wiki-content-dynamic-color--secondary | style="background-color:var(--wiki-content-dynamic-color--secondary);" | | A slightly different version of <code>--wiki-content-dynamic-color</code>. Usually this is {{color|#333}} on light themes and {{color|#ccc}} on dark themes. | style="background-color:var(--wiki-content-dynamic-color--secondary);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--inverted)">--wiki-content-dynamic-color--inverted</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary--inverted)">--wiki-content-dynamic-color--secondary--inverted</span><br/> |- | --wiki-content-dynamic-color--secondary--inverted | style="background-color:var(--wiki-content-dynamic-color--secondary--inverted);" | | The inverse of <code>--wiki-content-dynamic-color--secondary</code>. | style="background-color:var(--wiki-content-dynamic-color--secondary--inverted);" | <span style="color:var(--wiki-content-dynamic-color)">--wiki-content-dynamic-color</span><br/> <span style="color:var(--wiki-content-dynamic-color--secondary)">--wiki-content-dynamic-color--secondary</span><br/> |- | --wiki-content-heading-color | style="background-color:var(--wiki-content-heading-color);" | | The color of headings, such as the page title and section headings. Usually this is set to <code>--wiki-content-text-color</code>, but feel free to give it a different color to spice up the theme a little. | style="background-color:var(--wiki-content-heading-color);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span> |- | --wiki-accent-color | style="background-color:var(--wiki-accent-color);" | | Used to style infoboxes, navboxes, focused element outlines, and some buttons, such as the save button when editing. | style="background-color:var(--wiki-accent-color);" | <span style="color:var(--wiki-accent-label-color)">--wiki-accent-label-color</span><br/> <span style="color:var(--wiki-accent-link-color)">--wiki-accent-link-color</span><br/> <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/> |- | --wiki-accent-color--hover | style="background-color:var(--wiki-accent-color--hover);" | | The color of accent-color when hovered over, in some cases. Usually this is just accent-color with saturation and/or value reduced or increased by about 10%, but you're free to make it whatever you want provided the contrast checks to the right still pass. | style="background-color:var(--wiki-accent-color--hover);" | <span style="color:var(--wiki-accent-label-color)">--wiki-accent-label-color</span> |- | --wiki-accent-label-color | style="background-color:var(--wiki-accent-label-color);" | | The color of normal text against the accent color. | style="background-color:var(--wiki-accent-label-color);" | <span style="color:var(--wiki-accent-color)">--wiki-accent-color</span><br/> <span style="color:var(--wiki-accent-color--hover)">--wiki-accent-color--hover</span><br/> |- | --wiki-accent-link-color | style="background-color:var(--wiki-accent-link-color);" | | The color of links against the accent color. | style="background-color:var(--wiki-accent-link-color);" | <span style="color:var(--wiki-accent-color)">--wiki-accent-color</span> |- | --wiki-sidebar-background-color | style="background-color:var(--wiki-sidebar-background-color);" | | The background color of the sidebar to the left of the content area. Usually this inherits <code>--wiki-content-background-color</code>. | style="background-color:var(--wiki-sidebar-background-color);" | <span style="color:var(--wiki-sidebar-link-color)">--wiki-sidebar-link-color</span><br/> <span style="color:var(--wiki-sidebar-heading-color)">--wiki-sidebar-heading-color</span><br/> |- | --wiki-sidebar-border-color | style="background-color:var(--wiki-sidebar-border-color);" | | The border color of the sidebar. Usually this inherits <code>--wiki-content-border-color</code>. | N/A |- | --wiki-sidebar-link-color | style="background-color:var(--wiki-sidebar-link-color);" | | The color of links in the sidebar. Usually this inherits <code>--wiki-content-link-color</code>. | style="background-color:var(--wiki-sidebar-link-color);" | <span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span> |- | --wiki-sidebar-link-color--hover | style="background-color:var(--wiki-sidebar-link-color--hover);" | | The color links change to when hovered over. This is optional, and usually inherits <code>--wiki-content-link-color--hover</code>. | style="background-color:var(--wiki-sidebar-link-color--hover);" | <span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span> |- | --wiki-sidebar-heading-color | style="background-color:var(--wiki-sidebar-heading-color);" | | The color of headings in the sidebar. Usually this inherits <code>--wiki-content-heading-color</code>. | style="background-color:var(--wiki-sidebar-heading-color);" | <span style="color:var(--wiki-sidebar-background-color)">--wiki-sidebar-background-color</span> |- | --wiki-navigation-background-color | style="background-color:var(--wiki-navigation-background-color);" | | The primary background color of the navigation tabs above the content area. Usually this inherits <code>--wiki-content-background-color--secondary</code>. | style="background-color:var(--wiki-navigation-background-color);" | <span style="color:var(--wiki-navigation-text-color)">--wiki-navigation-text-color</span><br/> |- | --wiki-navigation-background-color--secondary | style="background-color:var(--wiki-navigation-background-color--secondary);" | | The upper background color of the navigation tabs, as well as the background color of the "More" menu dropdown. Usually this inherits <code>--wiki-content-background-color</code>. | style="background-color:var(--wiki-navigation-background-color--secondary);" | <span style="color:var(--wiki-navigation-text-color)">--wiki-navigation-text-color</span><br/> |- | --wiki-navigation-border-color | style="background-color:var(--wiki-navigation-border-color);" | | Border color of the navigation tabs. Usually this inherits <code>--wiki-content-border-color</code>. | N/A |- | --wiki-navigation-text-color | style="background-color:var(--wiki-navigation-text-color);" | | The color of text in the navigation tabs. Usually this inherits <code>--wiki-content-link-color</code>. | style="background-color:var(--wiki-navigation-text-color);" | <span style="color:var(--wiki-navigation-background-color)">--wiki-navigation-background-color</span><br/> <span style="color:var(--wiki-navigation-background-color--secondary)">--wiki-navigation-background-color--secondary</span><br/> |- | --wiki-navigation-text-color--hover | style="background-color:var(--wiki-navigation-text-color--hover);" | | The color of text in the navigation tabs when hovered. Usually this inherits <code>--wiki-content-link-color--hover</code>. | style="background-color:var(--wiki-navigation-text-color--hover);" | <span style="color:var(--wiki-navigation-background-color)">--wiki-navigation-background-color</span><br/> <span style="color:var(--wiki-navigation-background-color--secondary)">--wiki-navigation-background-color--secondary</span><br/> |- | --wiki-navigation-selected-background-color | style="background-color:var(--wiki-navigation-selected-background-color);" | | The background color of the currently active navigation tab. Usually this inherits <code>--wiki-content-background-color</code> | style="background-color:var(--wiki-navigation-selected-background-color);" | <span style="color:var(--wiki-navigation-selected-text-color)">--wiki-navigation-selected-text-color</span><br/> |- | --wiki-navigation-selected-border-color | style="background-color:var(--wiki-navigation-selected-border-color);" | | The border color of the currently active navigation tab. Usually this inherits <code>--wiki-navigation-border-color</code> | N/A |- | --wiki-navigation-selected-text-color | style="background-color:var(--wiki-navigation-selected-text-color);" | | The text color of the currently active navigation tab. Usually this inherits <code>--wiki-content-text-color</code> | style="background-color:var(--wiki-navigation-selected-text-color);" | <span style="color:var(--wiki-navigation-selected-background-color)">--wiki-navigation-selected-background-color</span><br/> |- | --wiki-neutral-color | style="background-color:var(--wiki-neutral-color);" | | A gray-ish color for displaying neutral text, such as a diff size of 0 in RecentChanges and page history. Usually this inherits <code>--wiki-content-text-mix-color</code>, but can be set explicitly if that color is not gray enough. | style="background-color:var(--wiki-neutral-color);" | <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span> |- | --wiki-alert-color | style="background-color:var(--wiki-alert-color);" | | A general, usually red-ish color used for negative notices, most notably negative diffs in RecentChanges and page history, and the "cancel" button when editing. | style="background-color:var(--wiki-alert-color);" | <span style="color:var(--wiki-alert-label-color)">--wiki-alert-label-color</span><br/> <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/> |- | --wiki-alert-label-color | style="background-color:var(--wiki-alert-label-color);" | | The color of text against <code>--wiki-alert-color</code> as a background. | style="background-color:var(--wiki-alert-label-color);" | <span style="color:var(--wiki-alert-color)">--wiki-alert-color</span><br/> |- | --wiki-warning-color | style="background-color:var(--wiki-warning-color);" | | A general, usually orange-ish color used for warning notices. | style="background-color:var(--wiki-warning-color);" | <span style="color:var(--wiki-warning-label-color)">--wiki-warning-label-color</span><br/> <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> |- | --wiki-warning-label-color | style="background-color:var(--wiki-warning-label-color);" | | The color of text against <code>--wiki-warning-color</code> as a background. | style="background-color:var(--wiki-warning-label-color);" | <span style="color:var(--wiki-warning-color)">--wiki-warning-color</span><br/> |- | --wiki-success-color | style="background-color:var(--wiki-success-color);" | | A general, usually green-ish color used for success notices, most noticeably positive diffs in RecentChanges and page history. | style="background-color:var(--wiki-success-color);" | <span style="color:var(--wiki-success-label-color)">--wiki-success-label-color</span><br/> <span style="color:var(--wiki-content-background-color)">--wiki-content-background-color</span><br/> <span style="color:var(--wiki-content-background-color--secondary)">--wiki-content-background-color--secondary</span><br/> |- | --wiki-success-label-color | style="background-color:var(--wiki-success-label-color);" | | The color of text against <code>--wiki-success-color</code> as a background. | style="background-color:var(--wiki-success-label-color);" | <span style="color:var(--wiki-success-color)">--wiki-success-color</span><br/> |} <h2>Stylesheet</h2> <!-- When rendered on common.css, the actual stylesheet will be right here --> </div> 46bda3c0aabbc7ea35b816706b99b474a2dc06df MediaWiki:DataMaps.css 8 247 271 2025-08-20T01:25:04Z ARTIFICER 564804 Importing default loadout css text/css /** Container */ .ext-datamaps-container-content .ext-datamaps-container-leaflet { background: var(--wiki-content-background-color--secondary); } /** Legend */ .ext-datamaps-container .ext-datamaps-control-expandable[aria-expanded="true"] { background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 95%, transparent); } .ext-datamaps-container .oo-ui-tabOptionWidget { color: var(--wiki-content-link-color); } .ext-datamaps-container .oo-ui-tabSelectWidget-frameless .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected { background: var(--wiki-content-link-color); box-shadow: none; color: var(--wiki-content-link-label-color); } /** Popups */ .ext-datamaps-container .leaflet-popup-content-wrapper, .ext-datamaps-container .leaflet-popup-tip { background: var(--wiki-content-background-color--secondary); color: var(--wiki-content-text-color); } .ext-datamaps-container .ext-datamaps-popup-buttons a, .ext-datamaps-container .leaflet-popup-close-button { filter: var(--wiki-icon-general-filter); cursor: pointer; } .ext-datamaps-popup-header .ext-datamaps-popup-subtitle, .ext-datamaps-popup-header .ext-datamaps-popup-location { color: var(--wiki-content-text-mix-color); } .ext-datamaps-popup .ext-datamaps-popup-tools li a { border: 1px solid var(--wiki-content-link-color); transition: background 100ms, color 100ms; } .ext-datamaps-popup .ext-datamaps-popup-tools li a:hover { background: var(--wiki-content-link-color); color: var(--wiki-content-link-label-color); } /** Controls */ .ext-datamaps-container .leaflet-bar { background-color: var(--wiki-content-background-color--secondary); border-color: color-mix(in srgb, var(--wiki-content-link-color) 50%, transparent); } .ext-datamaps-container .leaflet-bar button:hover { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 25%, transparent); } .ext-datamaps-container .leaflet-control { color: var(--wiki-content-text-color); } .leaflet-control-container .oo-ui-buttonElement > .oo-ui-buttonElement-button { min-height: unset; } .ext-datamaps-container .leaflet-control button { border-bottom-color: color-mix(in srgb, var(--wiki-content-link-color) 50%, transparent); color: var(--wiki-content-text-color); } /* HACK: awful selector, v1.0 will prolly use a standard class on these */ .ext-datamaps-container .ext-datamaps-control span[class^="oo-ui-icon"] { filter: var(--wiki-icon-general-filter); } /** Search */ .ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results { background: var(--wiki-content-background-color--secondary); } .ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results li:focus, .ext-datamaps-container .ext-datamaps-control-search ul.ext-datamaps-control-search-results li[data-highlighted="true"] { background: color-mix(in srgb, var(--wiki-content-link-color) 15%, transparent); color: var(--wiki-content-link-color); } .ext-datamaps-container .ext-datamaps-container-status > :not(.oo-ui-widget) { background:var(--wiki-content-background-color--secondary); color:var(--wiki-content-text-mix-color); } .ext-datamaps-container .leaflet-control-container .ext-datamaps-control-coords { background: var(--background-color-neutral-subtle); color: var(--color-base--subtle); } f3ef9024b4b537b9fa9bceff82bbbeaf0feb7f7a MediaWiki:Gadgets/mpEditLinks/main.js 8 248 272 2025-08-20T01:25:05Z ARTIFICER 564804 Importing default loadout javascript text/javascript $.when( $.ready ) .then(function(){ if(!document.getElementById('mp-container')) return; var rootpage = document.getElementById('mp-container').dataset['rootpage']; // Get the rootpage passed from the main page module, so we don't need to make an API call /* generate the links here instead of in the wikitext, so that users who can't see them don't have them * in the DOM at all, and screenreaders and search engines don't get confused */ function createLinks(){ $('.mp-box').each(function(_, el){ var params = '?action=edit'; // only add the long preload stuff if the box doesn't exist, for prettier urls if ( $(el).hasClass('missing') ){ params += '&preload=Template:Main page box/preload&preloadparams[0]=' + el.dataset['boxId'].charAt(0).toUpperCase() + el.dataset['boxId'].slice(1); /* preloadparam is box id with first letter capitalized */ } $('<a></a>', {href: mw.util.getUrl(rootpage + '/' + el.dataset['boxId']) + params}) .msg('gadget-mpEditLinks-edit-link-text', rootpage + '/' + el.dataset['boxId']) .appendTo( $('<div></div>', { class: 'mp-edit-link' }).prependTo(el) ); }); } function toggleLinks(){ $('.mp-edit-link').each(function(_, el){ $(el).toggle().css('display none;'); }); } $('<span></span>', { text: mw.msg('gadget-mpEditLinks-toggle-link-text'), class: 'mp-edit-toggle', on: {click: toggleLinks}, }).appendTo($('#top')); createLinks(); }); 6174d3c34c950700a1700ea0707b008195b25ce1 MediaWiki:Gadgets/mpEditLinks/main.css 8 249 273 2025-08-20T01:25:06Z ARTIFICER 564804 Importing default loadout css text/css .mp-edit-link { display:block; position:absolute; z-index:99; right:0.5em; top:0.5em; background:var(--wiki-content-background-color); } .mp-edit-link a { display:block; padding:0.1em; border:1px solid var(--wiki-content-link-color); } .mp-edit-link a::before { display:inline-block; content:''; background-image:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E%3Ctitle%3E edit %3C/title%3E%3Cpath d=%22m16.77 8 1.94-2a1 1 0 0 0 0-1.41l-3.34-3.3a1 1 0 0 0-1.41 0L12 3.23zM1 14.25V19h4.75l9.96-9.96-4.75-4.75z%22/%3E%3C/svg%3E"); background-size:contain; width:1em; height:1em; filter:var(--wiki-icon-to-link-filter); vertical-align:text-top; margin-right:0.2em; } c5fd62c547dd14df99d3f223cdca962743d492d1 MediaWiki:Gadgets/ranger/main.css 8 250 274 2025-08-20T01:25:06Z ARTIFICER 564804 Importing default loadout css text/css /** as of Module:navbox version 1.2.4 **/ .ranger-navbox{ border-color: var(--navbox-outer-border-color); border-style: var(--navbox-outer-border-style); border-width: var(--navbox-outer-border-width); border-radius: var(--navbox-outer-border-radius); padding: var(--navbox-padding); font-size: var(--navbox-font-size); margin: var(--navbox-margin); background: var(--navbox-background); line-height: 1.5; clear:both; } .ranger-navbox * { border: 0; } .ranger-navbox .center *{ margin-left: unset; margin-right: unset; } .ranger-navbox, .ranger-navbox .ranger-section, .ranger-navbox .ranger-listbox{ display: flex; flex-direction: column; gap: var(--navbox-gap); } .ranger-navbox .ranger-title, .ranger-navbox .ranger-header{ text-align: center; min-height: 1.5em; position: relative; z-index: 0; font-weight: bold; } .ranger-navbox .ranger-title{ color: var(--navbox-title-color); background: var(--navbox-title-background); font-size: var(--navbox-title-font-size); padding: var(--navbox-title-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */ } .ranger-navbox .ranger-title a, .ranger-navbox .ranger-title a:visited, .ranger-navbox .ranger-title a:hover, .ranger-navbox .ranger-title a.external, .ranger-navbox .ranger-title a.external:visited, .ranger-navbox .ranger-title a.external:hover { text-decoration: var(--navbox-title-link-decoration); } .ranger-navbox .ranger-title a.new, .ranger-navbox .ranger-title a.new:visited { text-decoration: var(--navbox-title-redlink-decoration); } .ranger-navbox .ranger-title a, .ranger-navbox .ranger-title a.external, .ranger-navbox .ranger-title a.external:visited { color: var(--navbox-title-link-color); } .ranger-navbox .ranger-title a:visited{ color: var(--navbox-title-link-color--visited); } .ranger-navbox .ranger-title a.new, .ranger-navbox .ranger-title a.new:visited{ color:var(--navbox-title-redlink-color); } .ranger-navbox .ranger-title a:hover, .ranger-navbox .ranger-title a:visited:hover, .ranger-navbox .ranger-title a.external:hover, .ranger-navbox .ranger-title a.external:visited:hover { color:var(--navbox-title-link-color--hover); } .ranger-navbox .ranger-header{ color: var(--navbox-header-color); background: var(--navbox-header-background); font-size: var(--navbox-header-font-size); padding: var(--navbox-header-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */ } .ranger-navbox .ranger-sublist .ranger-header{ font-size: var(--navbox-subheader-font-size); padding: var(--navbox-subheader-padding--y) calc(1.5em + var(--navbox-icon-offset--x)); /* left and right padding equal to the size and position of the edit/collapse buttons */ } .ranger-navbox .ranger-header a, .ranger-navbox .ranger-header a:visited, .ranger-navbox .ranger-header a:hover, .ranger-navbox .ranger-header a.external, .ranger-navbox .ranger-header a.external:visited, .ranger-navbox .ranger-header a.external:hover { text-decoration: var(--navbox-header-link-decoration); } .ranger-navbox .ranger-header a.new, .ranger-navbox .ranger-header a.new:visited { text-decoration: var(--navbox-header-redlink-decoration); } .ranger-navbox .ranger-header a, .ranger-navbox .ranger-header a.external, .ranger-navbox .ranger-header a.external:visited { color: var(--navbox-header-link-color); } .ranger-navbox .ranger-header a:visited{ color: var(--navbox-header-link-color--visited); } .ranger-navbox .ranger-header a.new, .ranger-navbox .ranger-header a.new:visited{ color:var(--navbox-header-redlink-color); } .ranger-navbox .ranger-header a:hover, .ranger-navbox .ranger-header a:visited:hover, .ranger-navbox .ranger-header a.external:hover, .ranger-navbox .ranger-header a.external:visited:hover { color:var(--navbox-header-link-color--hover); } .ranger-navbox .ranger-meta{ font-size: var(--navbox-title-font-size); position: absolute; left: var(--navbox-icon-offset--x); top: calc(var(--navbox-title-padding--y) + 0.08em); /* 0.08em: vertial offset tweak based on the icon graph */ display: block; } .ranger-navbox .ranger-meta .nv{ --mask: var(--icon-metalinks); display: block; width: 0.84em; /* based on the icon graph */ height: 0.84em; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--navbox-title-icon-color); } .ranger-navbox .ranger-meta .nv > a{ display: block; width: 100%; height: 100%; opacity: 0; } .ranger-navbox .ranger-meta .nv > a > span{ display: block; width: 100%; height: 100%; overflow: hidden; } .ranger-navbox .ranger-meta:has(.mw-selflink){ display: none; } .ranger-navbox, .ranger-navbox .ranger-section{ position: relative; } .ranger .mw-collapsible-toggle-placeholder{ display: none; } .ranger-navbox .ranger-title > .ranger-title-text, .ranger-navbox .ranger-header > .ranger-header-text{ pointer-events: none; } .ranger-navbox .ranger-title > .ranger-title-text a, .ranger-navbox .ranger-header > .ranger-header-text a{ pointer-events: auto; } .ranger-navbox .ranger-title > .mw-collapsible-toggle, .ranger-navbox .ranger-header > .mw-collapsible-toggle{ --mask: var(--icon-chevron-down); position: absolute; right: 0; top: 0; z-index: -1; display: block; width: 100%; height: 100%; overflow:hidden; } .ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle, .ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle{ width: 1.5em; height: 1.5em; right: var(--navbox-icon-offset--x); } .ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle{ top: var(--navbox-title-padding--y); } .ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle{ top: var(--navbox-header-padding--y); } .ranger-navbox.small-collapsible-toggle-click-area .ranger-sublist .ranger-header > .mw-collapsible-toggle{ top: var(--navbox-subheader-padding--y); } .ranger-navbox .ranger-title > .mw-collapsible-toggle::before, .ranger-navbox .ranger-header > .mw-collapsible-toggle::before{ content: ""; display: block; width: 1.5em; height: 1.5em; position: absolute; right: var(--navbox-icon-offset--x); -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--navbox-title-icon-color); transform: scaleY(-1); } .ranger-navbox .ranger-title > .mw-collapsible-toggle::before{ top: var(--navbox-title-padding--y); } .ranger-navbox .ranger-header > .mw-collapsible-toggle::before{ top: var(--navbox-header-padding--y); } .ranger-navbox .ranger-sublist .ranger-header > .mw-collapsible-toggle::before{ top: var(--navbox-subheader-padding--y); } .ranger-navbox.small-collapsible-toggle-click-area .ranger-title > .mw-collapsible-toggle::before, .ranger-navbox.small-collapsible-toggle-click-area .ranger-header > .mw-collapsible-toggle::before{ top: 0; right: 0; } .ranger-navbox .ranger-header > .mw-collapsible-toggle::before{ background-color: var(--navbox-header-icon-color); } .ranger-navbox .ranger-title > .mw-collapsible-toggle.mw-collapsible-toggle-collapsed::before, .ranger-navbox .ranger-header > .mw-collapsible-toggle.mw-collapsible-toggle-collapsed::before{ transform: none; } .ranger-navbox .ranger-title > .mw-collapsible-toggle *, .ranger-navbox .ranger-title > .mw-collapsible-toggle::after, .ranger-navbox .ranger-header > .mw-collapsible-toggle *, .ranger-navbox .ranger-header > .mw-collapsible-toggle::after{ display: none; } .ranger-navbox .ranger-list{ width: unset; padding: var(--navbox-list-padding); } .ranger-navbox .ranger-above{ background: var(--navbox-above-background); color: var(--navbox-above-color); padding: var(--navbox-above-padding); width: unset; } .ranger-navbox .ranger-below{ background: var(--navbox-below-background); color: var(--navbox-below-color); padding: var(--navbox-below-padding); width: unset; } .ranger-navbox .ranger-sublist{ display: flex; flex-direction: column; gap: var(--navbox-gap); } .ranger-navbox .ranger-section-body{ display: grid; gap: var(--navbox-gap); grid-template-columns: auto minmax(0,1fr); } /* gap fix for collapsed content */ .ranger-navbox [class^="ranger-"][hidden="until-found"]{ margin-top: calc(0px - var(--navbox-gap)) !important; } .ranger-navbox .ranger-row{ display: contents; } .ranger-navbox .ranger-group, .ranger-navbox .ranger-subgroup{ text-align: var(--navbox-group-text-align); font-weight: bold; background: var(--navbox-group-background); color: var(--navbox-group-color); padding: var(--navbox-group-padding); width: unset; } /* for desktop view */ .ranger-navbox.group-align-left .ranger-group, .ranger-navbox.group-align-left .ranger-subgroup{ --navbox-group-text-align: left; } .ranger-navbox.group-align-center .ranger-group, .ranger-navbox.group-align-center .ranger-subgroup{ --navbox-group-text-align: center; } .ranger-navbox.group-align-right .ranger-group, .ranger-navbox.group-align-right .ranger-subgroup{ --navbox-group-text-align: right; } /* for mobile view */ .ranger-navbox.mobile-group-align-left .ranger-group, .ranger-navbox.mobile-group-align-left .ranger-subgroup{ --navbox-group-text-align--mobile: left; } .ranger-navbox.mobile-group-align-center .ranger-group, .ranger-navbox.mobile-group-align-center .ranger-subgroup{ --navbox-group-text-align--mobile: center; } .ranger-navbox.mobile-group-align-right .ranger-group, .ranger-navbox.mobile-group-align-right .ranger-subgroup{ --navbox-group-text-align--mobile: right; } /* for desktop view */ .ranger-navbox.list-align-left .ranger-listbox{ --navbox-list-text-align: left; } .ranger-navbox.list-align-center .ranger-listbox{ --navbox-list-text-align: center; } .ranger-navbox.list-align-right .ranger-listbox{ --navbox-list-text-align: right; } /* for mobile view */ .ranger-navbox.mobile-list-align-left .ranger-listbox{ --navbox-list-text-align--mobile: left; } .ranger-navbox.mobile-list-align-center .ranger-listbox{ --navbox-list-text-align--mobile: center; } .ranger-navbox.mobile-list-align-right .ranger-listbox{ --navbox-list-text-align--mobile: right; } .ranger-navbox .ranger-listbox > .ranger-wrap{ text-align: var(--navbox-list-text-align); background: var(--navbox-list-background); color: var(--navbox-list-color); flex-grow: 1; } .ranger-navbox .ranger-sublist{ flex-grow: var(--count); } .ranger-navbox .ranger-listbox:first-child{ /* A list-n without group-n */ grid-column-end: span 2; } .ranger-navbox .ranger-group, .ranger-navbox .ranger-subgroup, .ranger-navbox .ranger-listbox > .ranger-wrap{ display: grid; justify-items: stretch; align-items: center; } .ranger-navbox.striped-even .ranger-even, .ranger-navbox.striped-odd .ranger-odd{ background: var(--navbox-list-background--striped); } /* make links use full line height (larger click box)*/ .ranger-navbox .hlist a{ display: inline-block; } .ranger-navbox .align-left, .ranger-navbox .alignleft{ text-align: left; } .ranger-navbox .align-center, .ranger-navbox .aligncenter{ text-align: center; } .ranger-navbox .align-right, .ranger-navbox .alignright{ text-align: right; } /* responsive */ @media screen and (max-width: 720px) { .ranger-navbox .ranger-section-body, .ranger-navbox .ranger-sublist { display: flex; flex-flow: column; } .ranger-navbox .ranger-row{ display: block; } .ranger-navbox .ranger-group + .ranger-listbox > .ranger-sublist:first-child, .ranger-navbox .ranger-subgroup + .ranger-listbox > .ranger-sublist:first-child{ margin-top: var(--navbox-gap); } .ranger-navbox .ranger-listbox.empty{ display: none; } .ranger-navbox .ranger-group, .ranger-navbox .ranger-subgroup{ text-align: var(--navbox-group-text-align--mobile, left); max-width: unset !important; } .ranger-navbox .ranger-group > *, .ranger-navbox .ranger-subgroup > *{ max-width: unset !important; } .ranger-navbox .ranger-sublist { padding-left: var(--navbox-tree-indent); margin-left: var(--navbox-tree-line-indent); } .ranger-navbox .ranger-subgroup, .ranger-navbox .ranger-listbox { position:relative; } .ranger-navbox .ranger-group br, .ranger-navbox .ranger-subgroup br{ display: none; } .ranger-navbox .ranger-listbox > .ranger-wrap{ text-align: var(--navbox-list-text-align--mobile, left); } .ranger-navbox .ranger-sublist > .ranger-section > .ranger-header{ margin-left: calc( 0px - var(--navbox-tree-indent) - var(--navbox-tree-line-indent)); } .ranger-navbox .ranger-sublist .ranger-row > ::before{ position: absolute; left: calc(0px - var(--navbox-tree-indent)); top: 0; width: var(--navbox-tree-line-width); height: 100%; content: ''; display: block; background-color: var(--navbox-tree-line-color); } .ranger-navbox .ranger-sublist .ranger-row > .ranger-listbox::before, .ranger-navbox .ranger-row.empty-list > .ranger-subgroup::before{ height: calc(100% + var(--navbox-gap)); } .ranger-navbox .ranger-sublist .ranger-row:last-child > ::before { display: none; } .ranger-navbox .ranger-sublist .ranger-row:last-child > :first-child::before { display: block; height: calc(50% + var(--navbox-tree-line-width)/2); } .ranger-navbox .ranger-subgroup::after, .ranger-navbox .ranger-row .ranger-row.empty-group > .ranger-listbox > .ranger-wrap::after{ position: absolute; left: calc(0px - var(--navbox-tree-indent) + var(--navbox-tree-line-width)); width: calc(var(--navbox-tree-indent) - var(--navbox-tree-line-spacing) - var(--navbox-tree-line-width)); height: var(--navbox-tree-line-width); content: ''; background-color: var(--navbox-tree-line-color); } /* increase height for links */ .ranger-navbox .hlist{ line-height: 2; } } /**** `.pill` class: the "pill" style ****/ /* remove middle dots betweem items */ .ranger-navbox.pill .hlist dd:not(:last-child)::after, .ranger-navbox.pill .hlist li:not(:last-child)::after{ display: none; } /* remove parentheses around nested lists*/ .ranger-navbox.pill .hlist dd ol::before, .ranger-navbox.pill .hlist dd ul::before, .ranger-navbox.pill .hlist dd dl::before, .ranger-navbox.pill .hlist dt ol::before, .ranger-navbox.pill .hlist dt ul::before, .ranger-navbox.pill .hlist dt dl::before, .ranger-navbox.pill .hlist li ol::before, .ranger-navbox.pill .hlist li ul::before, .ranger-navbox.pill .hlist li dl::before, .ranger-navbox.pill .hlist dd ol::after, .ranger-navbox.pill .hlist dd ul::after, .ranger-navbox.pill .hlist dd dl::after, .ranger-navbox.pill .hlist dt ol::after, .ranger-navbox.pill .hlist dt ul::after, .ranger-navbox.pill .hlist dt dl::after, .ranger-navbox.pill .hlist li ol::after, .ranger-navbox.pill .hlist li ul::after, .ranger-navbox.pill .hlist li dl::after { display: none; } /* make lists inline-flex */ .ranger-navbox.pill .hlist ul, .ranger-navbox.pill .hlist ol, .ranger-navbox.pill .hlist dl{ display: inline-flex; gap: var(--navbox-pill-gap); flex-wrap: wrap; } /* "pill" style for items */ .ranger-navbox.pill .hlist li, .ranger-navbox.pill .hlist dt, .ranger-navbox.pill .hlist dd{ padding: var(--navbox-pill-padding); border-radius: var(--navbox-pill-border-radius); box-shadow: var(--navbox-pill-box-shadow); background: var(--navbox-pill-background); /* 100% height */ display: flex; align-items: center; /* for nested lists */ gap: var(--navbox-pill-gap); flex-wrap: wrap; } /* Add a hover / focus feedback style */ .ranger-navbox.pill .hlist dd:hover, .ranger-navbox.pill .hlist dd:focus, .ranger-navbox.pill .hlist dt:hover, .ranger-navbox.pill .hlist dt:focus, .ranger-navbox.pill .hlist li:hover, .ranger-navbox.pill .hlist li:focus { box-shadow: var(--navbox-pill-box-shadow--hover); background: var(--navbox-pill-background--hover); } /* pill with selflink * * Only select the deepest level for nested lists. * We have to use :has() to pick pills with selflink and * all browsers which support :has() should also support :is() and :not(), * therefore we can use :is() and :not() here safely. */ .ranger-navbox.pill .hlist .ranger-list :is(li,dt,dd):has(.mw-selflink):not(:has(li, dt, dd)){ background: var(--navbox-pill-selflink-background); } /**** `.pill-mobile` class: only apply the "pill" style on mobile ****/ @media screen and (max-width: 720px) { /* remove middle dots betweem items */ .ranger-navbox.pill-mobile .hlist dd:not(:last-child)::after, .ranger-navbox.pill-mobile .hlist li:not(:last-child)::after{ display: none; } /* remove parentheses around nested lists*/ .ranger-navbox.pill-mobile .hlist dd ol::before, .ranger-navbox.pill-mobile .hlist dd ul::before, .ranger-navbox.pill-mobile .hlist dd dl::before, .ranger-navbox.pill-mobile .hlist dt ol::before, .ranger-navbox.pill-mobile .hlist dt ul::before, .ranger-navbox.pill-mobile .hlist dt dl::before, .ranger-navbox.pill-mobile .hlist li ol::before, .ranger-navbox.pill-mobile .hlist li ul::before, .ranger-navbox.pill-mobile .hlist li dl::before, .ranger-navbox.pill-mobile .hlist dd ol::after, .ranger-navbox.pill-mobile .hlist dd ul::after, .ranger-navbox.pill-mobile .hlist dd dl::after, .ranger-navbox.pill-mobile .hlist dt ol::after, .ranger-navbox.pill-mobile .hlist dt ul::after, .ranger-navbox.pill-mobile .hlist dt dl::after, .ranger-navbox.pill-mobile .hlist li ol::after, .ranger-navbox.pill-mobile .hlist li ul::after, .ranger-navbox.pill-mobile .hlist li dl::after { display: none; } /* make lists inline-flex */ .ranger-navbox.pill-mobile .hlist ul, .ranger-navbox.pill-mobile .hlist ol, .ranger-navbox.pill-mobile .hlist dl{ display: inline-flex; gap: var(--navbox-pill-gap); flex-wrap: wrap; } /* "pill" style for items */ .ranger-navbox.pill-mobile .hlist li, .ranger-navbox.pill-mobile .hlist dt, .ranger-navbox.pill-mobile .hlist dd{ /* 100% height */ display: flex; align-items: center; /* for nested lists */ gap: var(--navbox-pill-gap); flex-wrap: wrap; } /* "pill" style for items */ .ranger-navbox.pill-mobile .hlist li, .ranger-navbox.pill-mobile .hlist dt, .ranger-navbox.pill-mobile .hlist dd{ padding: var(--navbox-pill-padding); border-radius: var(--navbox-pill-border-radius); box-shadow: var(--navbox-pill-box-shadow); background: var(--navbox-pill-background); /* 100% height */ display: flex; align-items: center; /* for nested lists */ gap: var(--navbox-pill-gap); flex-wrap: wrap; } /* Add a hover / focus feedback style */ .ranger-navbox.pill-mobile .hlist dd:hover, .ranger-navbox.pill-mobile .hlist dd:focus, .ranger-navbox.pill-mobile .hlist dt:hover, .ranger-navbox.pill-mobile .hlist dt:focus, .ranger-navbox.pill-mobile .hlist li:hover, .ranger-navbox.pill-mobile .hlist li:focus { box-shadow: var(--navbox-pill-box-shadow--hover); background: var(--navbox-pill-background--hover); } /* pill with selflink * * Only select the deepest level for nested lists. * We have to use :has() to pick pills with selflink and * all browsers which support :has() should also support :is() and :not(), * therefore we can use :is() and :not() here safely. */ .ranger-navbox.pill-mobile .hlist .ranger-list :is(li,dt,dd):has(.mw-selflink):not(:has(li, dt, dd)){ background: var(--navbox-pill-selflink-background); } } /********************* * End Template:Navbox* **********************/ fe54cb7ce715e835bcc0c972d76364cbc18f5bc6 MediaWiki:Gadgets/ranger 8 251 275 2025-08-20T01:25:07Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": false, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with navboxes" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "variables.css", "main.css", "custom.css" ], "dependencies": [], "type": "styles" } } 0e59fa9520b52214b9fedaecae9f41d86afd197f MediaWiki:Gadgets/druid 8 252 276 2025-08-20T01:25:08Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "package": false, "section": "", "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with DRUID infoboxes" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "variablesEditMe.css", "mainReadonly.css", "customEditMe.css" ], "dependencies": [], "type": "styles" } } 5c21b27bf41aba17b090e0d888010c308bd5d0bb MediaWiki:Gadgets/druid/mainReadonly.css 8 253 277 2025-08-20T01:25:08Z ARTIFICER 564804 Importing default loadout css text/css /* --------------------------------------------- */ /* Do not edit this file please */ /* You can edit variablesEditMe and customEditMe */ /* --------------------------------------------- */ .druid-container { border: 4px solid var(--druid-border-color); border-radius: 3px; background: var(--druid-background-color); float: right; clear: right; margin: 0 0 1em 1em; width:100%; max-width:22em; box-sizing: border-box; border-collapse: collapse; } @media screen and (max-width: 720px) { .druid-container { float: none; margin: 0.5rem auto; } } .druid-main-images-file, .druid-main-image { text-align:center; } .druid-infobox .druid-title, .druid-infobox .druid-section { background:var(--druid-secondary-background-color); /* fallback */ background:color-mix(in srgb, var(--druid-secondary-background-color) 75%, transparent); color:var(--druid-secondary-background-label-color); text-align:center; font-size:1.5em; padding:1px; } .druid-infobox .druid-section { font-size: 1.25em; font-weight: 500; } .druid-infobox .druid-collapsible .druid-section { flex-grow: 1; } .druid-label { font-weight:bold; text-align: right; box-sizing: border-box; } .druid-row > .druid-label { width: 48%; flex-shrink: 0; } .druid-row > .druid-label, .druid-row > .druid-data { padding-inline: 0.3em; } .druid-main-image, .druid-main-images { padding:5px; } .druid-main-image img, .druid-main-images img { max-width:100%; height:auto; } .druid-main-images-labels { display:flex; flex-direction:row; flex-wrap:wrap; justify-content: space-evenly; margin:0.25em; gap:0.25em; } .druid-main-images-label { cursor:pointer; flex:1 1 auto; text-align:center; transition:.1s ease-in; outline:1px solid var(--druid-link-color); } .druid-main-images-label.focused { background:var(--druid-link-color); color:var(--druid-link-label-color); } .druid-main-images-label:not(.focused):hover { background:var(--druid-link-color); /* fallback */ background:color-mix(in srgb, var(--druid-link-color) 25%, transparent); } .druid-toggleable-data:not(.focused), .druid-main-images-file:not(.focused), .druid-toggleable-heading:not(.focused), .druid-row:not(:has(.druid-grid)):has(.druid-toggleable-data-empty.focused), .druid-grid-item:has(.druid-toggleable-data-empty.focused), .druid-section:has(.druid-toggleable-heading-empty.focused), .druid-section-container:has(.druid-toggleable-data-empty.focused):not(:has(.druid-toggleable-data-nonempty.focused)):not(:has(.druid-data-nonempty)) { display:none; } .druid-grid { display:grid; gap: 0.3em; padding: 0.35em; } .druid-grid-item { background:var(--druid-tertiary-background-color); padding:0.25em; border:1px solid var(--druid-border-color); /* fallback */ border:1px solid color-mix(in srgb, var(--druid-border-color) 50%, transparent); border-radius: 2px; } .druid-grid-item .druid-label, .druid-grid-item .druid-data { text-align: center; } .druid-data-wide { width:100%; } .druid-section-container > .druid-collapsible { display: flex; justify-content: space-between; align-items: center; } .druid-collapsed { display:none !important; } .druid-collapsible { cursor:pointer; position:relative; } .druid-collapsible::after { content: ""; display: block; position: absolute; right: 10px; width: 20px; height: 20px; --mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Ctitle%3E collapse %3C/title%3E%3Cpath d='M1 13.75l1.5 1.5 7.5-7.5 7.5 7.5 1.5-1.5-9-9-9 9z'/%3E%3C/svg%3E") no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--druid-secondary-background-label-color); } .druid-collapsible-collapsed::after { transform: rotate(180deg); } /***************************************** Div support *****************************************/ div.druid-row { display:flex; margin-block: 1px; } div.druid-row + div.druid-row { margin-top: 0; } div.druid-row > .druid-label { background: var(--druid-tertiary-background-color); } .druid-infobox .druid-title { font-weight: 700; } .druid-infobox #toc { display:none; } /******** Custom display classes *********/ div.druid-stacked.druid-row, .druid-stacked div.druid-row { flex-direction: column; } .druid-stacked.druid-row > .druid-label, .druid-stacked .druid-row > .druid-label { text-align: left; width: 100%; flex-basis:unset; } .druid-stacked.druid-row > .druid-data, .druid-stacked .druid-row > .druid-data { padding-left: .75em; } /* --------------------------------------------- */ /* Do not edit this file please */ /* You can edit variablesEditMe and customEditMe */ /* --------------------------------------------- */ b012f61bd994e50b85508138467794f6a296ed2d MediaWiki:Gadgets/druid/variablesEditMe.css 8 254 278 2025-08-20T01:25:09Z ARTIFICER 564804 Importing default loadout css text/css /* These variables are designed to inherit from your wiki's color variables. If your wiki uses a different naming scheme, change the inner names to match yours. If your wiki doesn't use color variables you should consider doing so, otherwise you can replace the inner variables or the fallback values with colors that match your wiki. */ /* Light and dark are separated to make it easier for you to do local customizations but in the default version they are identical */ :root, .view-light .druid-container { --druid-background-color: var(--wiki-content-background-color, #ffffff); --druid-secondary-background-color: var(--wiki-accent-color, #36c); --druid-secondary-background-label-color: var(--wiki-accent-label-color, #fff); --druid-tertiary-background-color: var(--wiki-content-background-color--secondary, #eaecf0); --druid-border-color: var(--wiki-content-border-color, #a7d7f9); --druid-link-color: var(--wiki-content-link-color, #0645ad); --druid-link-label-color: var(--wiki-content-link-label-color, #fff); } .view-dark .druid-container { --druid-background-color: var(--wiki-content-background-color, #101418); --druid-secondary-background-color: var(--wiki-accent-color, #36c); --druid-secondary-background-label-color: var(--wiki-accent-label-color, #fff); --druid-tertiary-background-color: var(--wiki-content-background-color--secondary, #202122); --druid-border-color: var(--wiki-content-border-color, #72777d); --druid-link-color: var(--wiki-content-link-color, #6d8afb); --druid-link-label-color: var(--wiki-content-link-label-color, #000); } 8fbdba8a0bd21c0bc819a404a5bec10170782fc2 MediaWiki:Gadgets/druid/customEditMe.css 8 255 279 2025-08-20T01:25:09Z ARTIFICER 564804 Importing default loadout css text/css /* Custom DRUID styles should go here */ 7ecb3c635f03ba714e419c200113f47043f0e358 MediaWiki:Gadgets/druid/doc 8 256 280 2025-08-20T01:25:10Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki <includeonly>This gadget provides styles for {{ml|Infobox}}. You can customize: * [[MediaWiki:Gadgets/druid/variablesEditMe.css]] - to customize the built-in variables (e.g. if you want to make the color of your infobox not match the wiki accent color). This file will load '''first''' out of all of the DRUID CSS files. * [[MediaWiki:Gadgets/druid/customEditMe.css]] - to otherwise customize DRUID (e.g. if you want to change the padding, or add a border image, something that's not supported through variables. This file will load '''last''' out of all of the DRUID CSS files, so all rules here will overwrite rules in [[MediaWiki:Gadgets/druid/mainReadonly.css]] with equal specificity. Please do NOT modify [[MediaWiki:Gadgets/druid/mainReadonly.css]]!! That page may be updated by wiki.gg staff via script, and the updates will not function if you modify it. More documentation can be found at [[support:DRUID infoboxes|DRUID infoboxes]]<!-- --></includeonly><noinclude>This is the documentation page for [[{{#titleparts:{{FULLPAGENAME}}|-1}}]].</noinclude> 2813eb77787e37161b0ed7e4e85c9f5f2d7ad92e MediaWiki:Newarticletext 8 257 281 2025-08-20T01:25:10Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [$1 help page] for more info). If you are here by mistake, click your browser's <strong>back</strong> button. 778f9ef242eb3058ef30ed3325b901adb762a2af MediaWiki:Gadgets 8 258 282 2025-08-20T01:25:11Z ARTIFICER 564804 Importing default loadout wikitext text/x-wiki See also: [[Special:Gadgets]] for a list of all installed gadgets, formatted in a friendly way. {{Special:PrefixIndex/MediaWiki:Gadgets}} 14815d26ea4ae878b5e77e1781eeb35cd742ad2c MediaWiki:Gadgets/druidScripts 8 259 283 2025-08-20T01:25:12Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with DRUID infoboxes" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } 5df47905f5c565c4a5c0da774413a6dee76eb7d1 MediaWiki:Gadgets/druidScripts/main.js 8 260 284 2025-08-20T01:25:12Z ARTIFICER 564804 Importing default loadout javascript text/javascript mw.hook( 'wikipage.content' ).add( () => { $( '.druid-title-tab' ).off( 'click' ) .on( 'click', function () { const $parent = $( this ).closest( '.druid-container' ); $parent.find( '.druid-toggleable' ).removeClass( 'focused' ); const i = $( this ).attr( 'data-druid' ); $parent.find( `.druid-toggleable[data-druid="${i}"]` ).addClass( 'focused' ); } ); $( '.druid-section-tab' ).off( 'click' ) .on( 'click', function () { const $parent = $( this ).closest( '.druid-section-container' ); $parent.find( '.druid-toggleable' ).removeClass( 'focused' ); const i = $( this ).attr( 'data-druid' ); $parent.find( `.druid-toggleable[data-druid="${i}"]` ).addClass( 'focused' ); } ); $( '.druid-collapsible' ).off( 'click' ) .on( 'click', function () { const kind = $( this ).attr( 'data-druid-section' ); $( this ) .toggleClass( 'druid-collapsible-collapsed' ) .closest( '.druid-container' ) .find( `[data-druid-section-row="${kind}"]` ) .toggleClass( 'druid-collapsed' ); } ); } ); /* End DRUID */ af8f73fc414f3fc0dae8d97a044675e9912fa457 MediaWiki:Gadgets/discordTemplate 8 261 285 2025-08-20T01:25:13Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with Discord embeds" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } 1232b7fbe2ff589295233393f6f387cf52793a2a MediaWiki:Gadgets/discordTemplate/main.js 8 262 286 2025-08-20T01:25:13Z ARTIFICER 564804 Importing default loadout javascript text/javascript /** * DiscordCompact.js * ---------------------- * A very simple script to display a Discord widget. * Version 0.0.2 * https://support.wiki.gg/wiki/DiscordCompact * ---------------------- */ $(function() { var widget = $("#content #discord-compact-widget"); // Bail out if we didn't find a widget. if (!widget.length) return; var id = widget.attr("data-id"); // Ensure that the id is not blank. if (id === "") throw new Error("DiscordCompact has a blank server id!"); // Ensure that the id consists only of numbers and is at least 17 characters long. if (!new RegExp("^[0-9]{17}[0-9]+$").test(id)) throw new Error("DiscordCompact has an invalid server id!"); var apiBase = "https://discord.com/api/guilds/" + id; // Get some information about the server, such as online member count and invite url. // This also tells us if the server exists or has widgets disabled, so we look out for that too. $.ajax(apiBase + "/widget.json").fail(function(req){ if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status); switch (req.responseJSON.code) { case 10004: throw new Error("DiscordCompact has a valid server id, but no such server exists!"); case 50004: throw new Error("DiscordCompact has a valid server id, but that server has widgets disabled!"); default: throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status + "; code: " + req.responseJSON.code + ")"); } }).done(function(res){ const inviteURL = res.instant_invite; // Warn if we can't get an invite URL. if (inviteURL == null) console.warn("DiscordCompact cannot get an invite URL; does this server have an invite channel set in Widget settings?"); // Now get the widget image. $.ajax({url: apiBase + "/widget.png?style=banner2", xhrFields: {responseType: "blob"}}).fail(function(req){ if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status); throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status + "; code: " + req.responseJSON.code + ")"); }).done(function(blob){ // Convert the image data into base64. This prevents us having to make the client request it a second time. const imageReader = new FileReader(); imageReader.readAsDataURL(blob); imageReader.onloadend = function() { const b64Data = imageReader.result; // Replace the widget with an <a> tag widget.replaceWith(function() { return $("<a>", { id: widget.attr("id"), class: widget.attr("class"), style: widget.attr("style"), alt: "Discord server widget", href: inviteURL }); }); // We need to grab the widget again to update it. widget = $("#discord-compact-widget"); // Setup the CSS so that the image is displayed. widget.css("display", "block"); widget.css("max-height", "76px"); widget.css("max-width", "320px"); // Create the image. const widgetImage = document.createElement("img"); widgetImage.src = b64Data; widgetImage.style.width = "100%"; widgetImage.style.height = "100%"; widgetImage.style.borderRadius = "5px"; widget.append(widgetImage); // Prevent image dragging. widget.on("dragstart", function(e) { e.preventDefault(); }); // We're done here. console.log("DiscordCompact loaded successfully!"); } }); }); }); /** * based on https://dev.fandom.com/wiki/MediaWiki:DiscordIntegrator/code.js * * used by other wikis. */ $(function() { 'use strict'; var mconfig = mw.config.get([ 'wgContentLanguage', 'wgUserLanguage', 'wgUserName' ]); if (window.DiscordIntegratorLoaded) { return; } window.DiscordIntegratorLoaded = true; /** * Main object * @static */ var DiscordIntegrator = { /** * Initializing */ init: function() { mw.hook('wikipage.content').add($.proxy(this.insertToContent, this)); }, /** * Finding the designated places in content * in which to place the widget and placing it */ insertToContent: function($content) { $content.find('.DiscordIntegrator:not(.loaded)').each($.proxy(function(cabbage, el) { el = $(el); el.html(this.generateContent(el.data())).addClass('loaded'); }, this)); }, /** * Determines the theme of the widget. * @param {string} config Configured theme * @return {string} 'light' or 'dark' depending on the wiki theme and configuration */ determineTheme: function(config) { // If explicitly configured to light or dark. if (config === 'dark') { return 'dark'; } if (config === 'light') { return 'light'; } /** If not configured **/ // try to determine based on wiki theme (set by themeToggle): var clas = $(':root').attr('class'); var regex = /(^|\s)theme-(\w+)(\s|$)/; var match = clas.match(regex); if(match){ var wikiThemeName = match[2]; if(typeof(config) === 'object' && config !== null){ //with json theme config if(config[wikiThemeName]){ return config[wikiThemeName]; } } if(wikiThemeName === 'light'){ return 'light'; } if(wikiThemeName === 'dark'){ return 'dark'; } } // Otherwise, default to dark. return 'dark'; }, /** * Generating widget content from an object * @return {string} Content of the widget */ generateContent: function(config) { if (!config.id || !String(config.id).match(/\d{17,19}/)) { return "Error: ID of the widget is malformed or not supplied, please see <a href='https://support.wiki.gg/wiki/DiscordWidget' title='the instructions'>the instructions</a> for how to find your server's ID. Please make sure you are not inserting <strong>the DiscordIntegrator template</strong> when asked for <strong>your widget ID</strong>."; } if ( ( config.loggedIn === true || Boolean(config['logged-in']) === true && config['logged-in'] !== 'false' && config['logged-in'] !== '{{{loggedIn}}}' ) && !mconfig.wgUserName ) { return "Please <a href='/Special:UserLogin' title='log in'>log in</a> to see this widget."; } var username = config.username === '@disabled' ? '' : config.username === '@function' && typeof window.DiscordIntegratorGetUsername === 'function' ? window.DiscordIntegratorGetUsername() : config.username || mconfig.wgUserName; return mw.html.element('iframe', { src: 'https://discord.com/widget?id=' + config.id + '&theme=' + this.determineTheme(config.theme) + '&username=' + encodeURIComponent(username), width: config.width || '100%', height: config.height || '400px', allowtransparency: 'true', frameborder: '0', title: "Discord server widget" }); } }; DiscordIntegrator.init(); }); 1e1fd5704120cf67e15a757bd964c7295bdb464e MediaWiki:Gadgets/luaImportLinks 8 263 287 2025-08-20T01:25:14Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [ 828 ], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } e5843d78effc2d04aa1fde18970885a1845ae525 MediaWiki:Gadgets/luaImportLinks/main.js 8 264 288 2025-08-20T01:25:14Z ARTIFICER 564804 Importing default loadout javascript text/javascript /* Link to imported modules from Lua code */ $(function() { var config = mw.config.get([ 'wgCanonicalNamespace', 'wgFormattedNamespaces' ]); if (config.wgCanonicalNamespace !== 'Module') { return; } var localizedNamespace = config.wgFormattedNamespaces[828]; $('.s1, .s2, .s').each(function() { var $this = $(this); var html = $this.html(); var quote = html[0]; var isLongStringQuote = quote === '['; var quoteRE = new RegExp('^\\' + quote + '|\\' + quote + '$', 'g'); if (isLongStringQuote) { quoteRE = /^\[\[|\]\]$/g; } var name = html.replace(quoteRE, ''); var isEnglishPrefix = name.startsWith('Module:'); var isLocalizedPrefix = name.startsWith(localizedNamespace + ':'); var isDevPrefix = name.startsWith('Dev:'); if (isEnglishPrefix || isLocalizedPrefix || isDevPrefix) { var attrs = { href: mw.util.getUrl(name) }; if (isDevPrefix) { attrs.href = 'https://commons.wiki.gg/wiki/Module:' + mw.util.wikiUrlencode(name.replace('Dev:', '')); attrs.target = '_blank'; attrs.rel = 'noopener'; } var link = mw.html.element('a', attrs, name); var str = quote + link + quote; if (isLongStringQuote) { str = '[[' + link + ']]'; } $this.html(str); } }); }); dc09796545586723653a906ae1fed87411f49536 MediaWiki:Gadgets/spoilers/main.js 8 265 289 2025-08-20T01:25:15Z ARTIFICER 564804 Importing default loadout javascript text/javascript /* [[Template:Spoiler]] */ mw.hook('wikipage.content').add(function() { $('.spoiler-content') .off('click') // in case this code is loaded twice .on('click', function(e){ $(this).toggleClass('show'); }).find('a').on('click', function(e){ e.stopPropagation(); }); }); /* End Template:Spoiler */ c96e5a798a1781287a56037db79ab9094a3eae2b MediaWiki:Gadgets/spoilers 8 266 290 2025-08-20T01:25:16Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with spoilers" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } e2aacbae968c704385f3937e6b0004f263907193 MediaWiki:Gadgets/charInserts 8 267 291 2025-08-20T01:25:16Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [ "edit" ], "categories": [], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } 518bbdc62f3fe767736f2de6ee9ba2b7eb9ab0a8 MediaWiki:Gadgets/charInserts/main.js 8 268 292 2025-08-20T01:25:17Z ARTIFICER 564804 Importing default loadout javascript text/javascript $(function() { $('.mw-charinsert-item').each(function() { $(this).text($(this).closest('div').attr('data-ci-label')); $(this).css('display', 'inline-block'); }); $('.ci-loading-text').css('display','none'); }); daabc4b17b7729432f5c146630a0715a7abc13e9 MediaWiki:Gadgets/themeColorEditor 8 269 293 2025-08-20T01:25:18Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [ 8 ], "contentModels": [ "css" ], "rights": [ "editinterface" ] }, "module": { "pages": [ "main.js" ], "dependencies": [], "type": "general" } } b512452ab2c0b2fd4d86d6a70c4c80fba41d14ed MediaWiki:Gadgets/themeColorEditor/main.js 8 270 294 2025-08-20T01:25:18Z ARTIFICER 564804 Importing default loadout javascript text/javascript $(function() { if (mw.config.get('wgPageName') != "MediaWiki:Common.css") return; mw.loader.load( 'https://commons.wiki.gg/load.php?lang=en&modules=ext.gadget.themeColorEditorScript&skin=vector&maxage=360&smaxage=360' ) }); a6d1c6789815c3c323c2afd84def2c1ca23d5efe MediaWiki:Gadgets/ranger/variables.css 8 271 295 2025-08-20T01:25:19Z ARTIFICER 564804 Importing default loadout css text/css .ranger-navbox{ --navbox-background: var(--wiki-content-background-color); /* for entire navbox */ --navbox-margin: 0.5em auto; --navbox-padding: 4px; --navbox-gap: 3px; /* when using zero-value, it must be 0px */ --navbox-outer-border-color: var(--wiki-content-border-color--accent); --navbox-outer-border-width: 1px; --navbox-outer-border-style: solid; --navbox-outer-border-radius: 0px; --navbox-font-size: calc(1em - 2px); --navbox-title-color: var(--wiki-accent-label-color); --navbox-title-font-size: calc(125%); --navbox-title-background: var(--wiki-accent-color); --navbox-title-icon-color: var(--wiki-accent-label-color); --navbox-title-link-color: var(--navbox-title-color); --navbox-title-link-color--visited: var(--navbox-title-link-color); --navbox-title-link-color--hover: var(--wiki-accent-link-color); --navbox-title-redlink-color: var(--navbox-title-link-color); --navbox-title-link-decoration: underline solid; --navbox-title-redlink-decoration: underline wavy; --navbox-title-padding--y: 0.5em; --navbox-above-background: color-mix(in srgb, var(--wiki-content-text-color) 15%, transparent); --navbox-above-color: var(--wiki-content-text-color); --navbox-above-padding: var(--navbox-list-padding); --navbox-below-background: var(--navbox-above-background); --navbox-below-color: var(--navbox-above-color); --navbox-below-padding: var(--navbox-above-padding); --navbox-header-color: var(--navbox-title-color); --navbox-header-font-size: calc(110%); --navbox-header-background: var(--navbox-title-background); --navbox-header-icon-color: var(--navbox-title-icon-color); --navbox-header-link-color: var(--navbox-title-link-color); --navbox-header-link-color--visited: var(--navbox-title-link-color--visited); --navbox-header-link-color--hover: var(--navbox-title-link-color--hover); --navbox-header-redlink-color: var(--navbox-title-redlink-color); --navbox-header-link-decoration: var(--navbox-title-link-decoration); --navbox-header-redlink-decoration: var(--navbox-title-redlink-decoration); --navbox-header-padding--y: 0.3em; --navbox-subheader-font-size: calc(100%); --navbox-subheader-padding--y: calc(var(--navbox-header-padding--y)/2); --navbox-list-background: color-mix(in srgb, var(--wiki-content-text-color) 5%, transparent); --navbox-list-background--striped: color-mix(in srgb, var(--wiki-content-text-color) 8%, transparent); --navbox-list-color: var(--wiki-content-text-color); --navbox-list-padding: 0.25em 0.5em; /* --navbox-group-* also apply to .ranger-subgroup */ --navbox-group-text-align: left; --navbox-group-text-align--mobile: left; /* only for mobile view */ --navbox-group-background: color-mix(in srgb, var(--wiki-accent-color) 20%, transparent); --navbox-group-color: var(--wiki-content-text-color); --navbox-group-padding: var(--navbox-list-padding); --navbox-tree-line-color: color-mix(in srgb, var(--wiki-accent-color) 30%, transparent); --navbox-tree-line-width: 2px; --navbox-tree-indent: 1em; --navbox-tree-line-indent: 0.5em; --navbox-tree-line-spacing: var(--navbox-gap); --icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E"); --icon-metalinks: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-edit' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1'%3E%3C/path%3E%3Cpath d='M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z'%3E%3C/path%3E%3Cpath d='M16 5l3 3'%3E%3C/path%3E%3C/svg%3E"); --navbox-icon-offset--x: 0.5rem; /* should be an absolute length (rem-based or px-based) */ } .ranger-navbox.pill, .ranger-navbox.pill-mobile{ /** vars for the "pill" style only (`.pill` and ".pill-mobile" clases) **/ --navbox-pill-gap: 0.3em; --navbox-pill-padding: 0.25em 0.75em; --navbox-pill-border-radius: 3px; --navbox-pill-box-shadow: none; --navbox-pill-background: color-mix(in srgb, var(--wiki-content-text-color) 5%, transparent); --navbox-pill-box-shadow--hover: inset 0 0 3px var(--navbox-list-color); --navbox-pill-background--hover: var(--navbox-pill-background); --navbox-pill-selflink-background: color-mix(in srgb, var(--wiki-accent-color) 15%, transparent);/* background of pills with selflink in them */ /* remove list cell background */ --navbox-list-background: none; --navbox-list-background--striped: color-mix(in srgb, var(--wiki-content-text-color) 3%, transparent); } .ranger-navbox.no-underline-title-links{ --navbox-title-link-color: var(--wiki-accent-link-color); --navbox-title-link-decoration: none; --navbox-title-redlink-decoration: none; } .ranger-navbox.noborder, .ranger-navbox.no-border{ --navbox-padding: 0px; --navbox-outer-border-width: 0px; } /****************************** * Fallback for older browsers * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .ranger-navbox { --navbox-above-background: var(--wiki-content-background-color--secondary); --navbox-list-background: transparent; --navbox-list-background--striped: var(--wiki-content-background-color--secondary); --navbox-group-background: var(--wiki-content-background-color--secondary); --navbox-tree-line-color: var(--wiki-content-background-color--secondary); } .ranger-navbox.pill, .ranger-navbox.pill-mobile { --navbox-pill-background: var(--wiki-content-background-color--secondary); --navbox-list-background--striped: transparent; --navbox-pill-selflink-background: var(--wiki-content-background-color--secondary); } } /*************** * End fallback * ****************/ 0f49887270380cdac6968f16cfc75a115818c39a MediaWiki:Gadgets/hoverShowSpoilers 8 272 296 2025-08-20T01:25:19Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": false, "default": false, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [ "Pages with spoilers" ], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.css" ], "dependencies": [], "type": "styles" } } 427adff0005c5bf986f2bca5bf83943f65359867 MediaWiki:Gadgets/mpEditLinks 8 273 297 2025-08-20T01:25:20Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [], "contentModels": [], "rights": [ "editprotected" ] }, "module": { "pages": [ "main.css", "main.js" ], "messages": [ "gadget-mpEditLinks-edit-link-text", "gadget-mpEditLinks-toggle-link-text" ], "dependencies": [ "jquery", "mediawiki.jqueryMsg", "mediawiki.util" ], "type": "general" } } a6733e82425fccced50edfeace86534103f0424b MediaWiki:Gadgets/collapsibleSidebarSections 8 274 298 2025-08-20T01:25:21Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "appearance", "package": true, "default": false, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.css", "main.js" ], "dependencies": [ "jquery" ], "type": "general" } } d67dc8fabaf4e1d275a3b17c42f3d707f00b707c MediaWiki:Gadgets/collapsibleSidebarSections/main.js 8 275 299 2025-08-20T01:25:21Z ARTIFICER 564804 Importing default loadout javascript text/javascript $(function(){ // CONFIG section, you can edit this part // a list of sections that should be collapsed by default for *all users*. // This should be the name of the heading as listed in Mediawiki:Sidebar and is case-sensitive. // For example, if you have '* Character_Classes' and you want that section collapsed, add 'Character_Classes' into the brackets below. // Separate entries with commas and use underscores instead of spaces. // Example list: ['Character_Classes', 'Items', 'External_Links'] // Please DO NOT add navigation or tb into this list, as they are expected functionality. var INITIALLY_COLLAPSED_IDS = []; var MIN_ACTIVATION_WIDTH = 721; //END CONFIG // add the p- onto ids for ease of use, if not present INITIALLY_COLLAPSED_IDS.forEach(function(id, index){ if(!id.startsWith('p-')){ INITIALLY_COLLAPSED_IDS[index] = 'p-' + id; } }); var $portals = $("#mw-panel .vector-menu-portal"); var setup = function(){ $portals.each(function(index, el){ if(window.innerWidth < MIN_ACTIVATION_WIDTH) { return; } var $el = $(el); var $id = $el.attr("id"); if(!$id){ return; } // check if this portal should be collapsed if( // portal is set to be initially collapsed and user has not indicated that they want it open (INITIALLY_COLLAPSED_IDS.includes($id) && localStorage.getItem('sidebar_c_'+$id) != "n") || // or // user has indicated they want this portal collapsed (localStorage.getItem('sidebar_c_'+$id) === "y") ){ $el.addClass('collapsed').find('.vector-menu-content').slideUp(0); } }); } setup(); $(window).on('resize', setup); $portals.on("click", "h3", function(event){ if(window.innerWidth < MIN_ACTIVATION_WIDTH) { return; } var $el = $(this).parent(); var $id = $el.attr("id"); if(!$id){ return; } $el.toggleClass('collapsed'); if($el.hasClass('collapsed')){ // more consistent between class and slide status. localStorage.setItem('sidebar_c_'+$id, "y"); $el.find('.vector-menu-content').slideUp('fast'); } else{ localStorage.setItem('sidebar_c_'+$id, "n"); $el.find('.vector-menu-content').slideDown('fast'); } }); }); 63d4425138f9c81e8294fbd01a08de9e1f58256a MediaWiki:Gadgets/collapsibleSidebarSections/main.css 8 276 300 2025-08-20T01:25:22Z ARTIFICER 564804 Importing default loadout css text/css @media screen and (min-width: 721px) { .client-js #mw-panel .portal:not(#p-ext-discordwidget) .vector-menu-heading { cursor: pointer; display: flex; align-items: center; justify-content: space-between; transition: all 0.2s; } .client-js #mw-panel .portal:not(#p-ext-discordwidget) .vector-menu-heading::after { content: ""; display: block; pointer-events: none; width: 1em; height: 1em; margin-top: 1px; /* offset */ --mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-down' width='24' height='24' viewBox='0 0 24 24' stroke-width='2' stroke='currentColor' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M6 9l6 6l6 -6'%3E%3C/path%3E%3C/svg%3E") no-repeat; -webkit-mask: var(--mask); mask: var(--mask); -webkit-mask-size: 100% 100%; mask-size: 100% 100%; -webkit-mask-position: center center; mask-position: center center; background-color: var(--wiki-sidebar-heading-color, var(--wiki-sidebar-link-color)); transform: rotate(180deg); } .client-js #mw-panel .portal:not(#p-ext-discordwidget).collapsed .vector-menu-heading::after { transform: rotate(0deg); } .client-js #mw-panel .vector-menu-portal.collapsed .vector-menu-heading { margin-bottom: 0; } } 5ab6f9e9146615a8038e81b9990004fdb06e00c0 MediaWiki:Gadgets/uploadMultipleFiles 8 277 301 2025-08-20T01:25:23Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [ -1 ], "contentModels": [], "rights": [ "edit", "upload" ] }, "module": { "pages": [ "main.js" ], "dependencies": [ "jquery", "mediawiki.util" ], "type": "general" } } 13bc1e984c367575a7b4f4ac29d2cf75b4f01c6c MediaWiki:Gadgets/purge 8 278 302 2025-08-20T01:25:23Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [], "contentModels": [], "rights": [ "edit" ] }, "module": { "pages": [ "main.js" ], "messages": [ "cargo-purgecache", "cargo-purgecache-failed", "action-purge" ], "dependencies": [ "mediawiki.util", "mediawiki.api", "mediawiki.jqueryMsg" ], "type": "general" } } ebb5f4bfef49746bef46514b0ffaccee57f3f1cd MediaWiki:Gadgets/ranger/custom.css 8 279 303 2025-08-20T01:25:24Z ARTIFICER 564804 Importing default loadout css text/css /* Custom RANGER styles can go here. Rules here will override rules of equal specificity in main.css */ 769d3248cef93d2b58dcf7339da923494f5173f8 MediaWiki:Gadgets/vectorScripts 8 280 304 2025-08-20T01:25:24Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": true, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [], "contentModels": [], "rights": [], "skins": [ "vector" ] }, "module": { "pages": [ "main.js" ], "dependencies": [], "type": "general" } } f26fca963d213febee869477a05933a6fedfc542 MediaWiki:Gadgets/vectorScripts/main.js 8 281 305 2025-08-20T01:25:25Z ARTIFICER 564804 Importing default loadout javascript text/javascript /*** Mobile navigation toggle button ***/ ( function () { const BUTTON_CLASS = 'mobile-nav-toggle'; const EXPANDED_CLASS = 'nav--expanded'; if (document.querySelector('button.' + BUTTON_CLASS)){return;} // early return to avoid double button if this runs twice let mobileSidebarButton = document.createElement( 'button' ); let sidebar = document.getElementById( 'mw-panel' ); mobileSidebarButton.className = BUTTON_CLASS; mobileSidebarButton.addEventListener( 'click', function () { mobileSidebarButton.classList.toggle( EXPANDED_CLASS ); sidebar.classList.toggle( EXPANDED_CLASS ); } ); sidebar.prepend( mobileSidebarButton ); document.body.classList.add( 'has-vector-mobile-menu' ); } )(); /*** End mobile navigation toggle button ***/ /*** #mw-head collapsing fix ***/ /*** IMPORTANT: Do not copy this code if your wiki is not updated to default loadout 2.0 (May 22, 2025) or later, or your navigation tabs will break ***/ mw.loader.using('skins.vector.legacy.js', function() { $.collapsibleTabs.calculateTabDistance = function(){ return parseInt(window.getComputedStyle(document.getElementById( 'right-navigation' ), '::before').width ) - 1; } }); /*** END #mw-head collapsing fix ***/ cb209a13dfc674d9ad471ec79784c4d65ad785f1 MediaWiki:Gadgets/userProfile 8 282 306 2025-08-20T01:25:26Z ARTIFICER 564804 Importing default loadout GadgetDefinition application/json { "settings": { "section": "", "package": true, "default": true, "hidden": false, "supportsUrlLoad": false }, "loadConditions": { "actions": [], "categories": [], "namespaces": [ -1, 2, 3 ], "contentModels": [], "rights": [] }, "module": { "pages": [ "main.js", "main.css" ], "dependencies": [ "mediawiki.interface.helpers.styles", "mediawiki.util", "mediawiki.api", "jquery" ], "type": "general" } } e9c76b459199205abae5373548f6ff36e83fefcc File:Site-favicon.ico 6 283 307 2025-08-20T23:13:27Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad 308 307 2025-08-20T23:14:46Z Sharparam 284703 Protected "[[File:Site-favicon.ico]]": Favicon used for the entire site ([Edit=Allow only users with a confirmed email address] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad File:Site-logo.png 6 284 309 2025-08-20T23:16:37Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad 310 309 2025-08-20T23:17:03Z Sharparam 284703 Protected "[[File:Site-logo.png]]": Logo for the whole wiki ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad Template:Navbox/Items 10 285 323 322 2025-08-20T23:22:44Z Sharparam 284703 12 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Essential items|Essential]] | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 7ddddd74185f43622c0032fb924e9ea4df3f2c1d Template:Navbox/Consumables 10 286 330 329 2025-08-20T23:22:44Z Sharparam 284703 6 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] | group2 = Fluids | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Regenerative Fluid]] * [[Restorative Fluid]] | group3 = Concoctions | list3 = * [[Diver's Lungs Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Mighty Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Concoction: Zealot's Tears]] * [[Experience Concoction]] * [[Mystery Concoction]] }}<noinclude>[[Category:Navigation templates]]</noinclude> e9736a1ea6833ecda5952ac6a85bce948c9cf19a Template:Navbox/Capes 10 287 336 335 2025-08-20T23:22:44Z Sharparam 284703 5 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Capes | title = [[Capes]] | list1 = * [[Agile Cape]] * [[Corrupted Cape]] * [[Folk Cape]] * [[Fur Cape]] * [[Ronin Scarf]] * [[Sentinel Overcoat]] * [[Spectre Scarf]] * [[Tattered Cape]] * [[Techpriest Cape]] * [[Traveler Cape]] * [[Wanderer Cape]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 25d3fe6cdc6b4cce6fe483d3b4b7218599b53b34 Template:Navbox/Anomalous crystals 10 288 339 338 2025-08-20T23:22:44Z Sharparam 284703 2 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Anomalous crystals | title = [[Anomalous crystals]] | list1= * [[Lesser Anomalous Crystal]] * [[Anomalous Crystal]] * [[Greater Anomalous Crystal]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ebedb2789af69363588ddf5553b8868dcbf7005d Template:Navbox/Lore 10 289 344 343 2025-08-20T23:22:45Z Sharparam 284703 4 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Lore | title = [[Lore]] | group1 = [[Data logs]] | list1 = {{Navbox/Data logs|child}} | group2 = [[Documents]] | list2 = {{Navbox/Documents|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> cc386cacfb50aa464ec9e6065463991e75c6ef65 Template:Navbox/Data logs 10 290 367 366 2025-08-20T23:22:45Z Sharparam 284703 22 revisions imported: Import from private test wiki wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[Understanding]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 09b921cd27b38e22701e9064c302db0e3c8d90f3 Template:Navbox/Documents 10 291 369 368 2025-08-20T23:22:45Z Sharparam 284703 1 revision imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Documents | title = [[Documents]] | list1 = * [[Konrad's War Log]] * [[Helena's Diary Fragment]] * [[Hellicar's Maxims]] * [[Guiscard's Manifest]] * [[Untitled Log]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 4859742a1634980b598ee96ab98cf1b44828e159 Template:Navbox/Rings 10 292 376 375 2025-08-20T23:22:46Z Sharparam 284703 6 revisions imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Hawk]] * [[Ring of Rammstein]] * [[Ring of Lesser Talent]] * [[Ring of Talent]] * [[Ring of Exceeding Talent]] }}<noinclude>[[Category:Navigation templates]]</noinclude> a26fb4e5bb5097e037bde34bbe50c7f6f0fd3453 Template:Navbox/Locations 10 293 383 382 2025-08-20T23:22:46Z Sharparam 284703 6 revisions imported: Import from private test wiki wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ([[Monastery#Lower|Lower]] · [[Monastery#Upper|Upper]]) * [[Blok 6147]] * [[Rain District]] ([[Rain District#Sewers|Sewers]] · [[Rain District#Center|Center]]) * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ([[Uranopolis#Tower Complex|Tower Complex]] · [[Uranopolis#Lone Tower|Lone Tower]]) * [[Ghost Town]] ([[Ghost Town#Floor 13|Floor 13]] · [[Ghost Town#Floor 1|Floor 1]]) * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown (location)|Unknown]] * [[Vermillion Fields]] ([[Vermillion Fields#Plaza|Plaza]] · [[Vermillion Fields#Temple|Temple]]) }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> 7716644faea4dd5aee763d21d89daca0de53c69c Template:Navbox/NPCs 10 294 385 384 2025-08-20T23:22:46Z Sharparam 284703 1 revision imported: Import from private test wiki wikitext text/x-wiki {{Navbox | {{{child|}}} | template = Navbox/NPCs | title = [[NPCs]] | list1 = * [[Abandoned Soldier]] * [[Abelard the Brave]] * [[Anselm the Pure]] * [[Archinquisitor Belisarius]] * [[The Handler]] * [[Inquisitor Commander Alexius]] * [[Mysterious Woman]] * [[Royal Division Captain Yulia]] * [[Stranger]] * [[Yaroslav]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] <noinclude> 19819092a7dffc936dc5330f6d3c7764bede86db User:Sharparam 2 295 386 2025-08-20T23:25:19Z Sharparam 284703 Created page with "{{#invoke:infobox|main | title = Sharparam | image = [[File:Sharparam.png|300px|link=]] | sections = Basic Info,Socials | Basic Info = Pronouns, Website | Pronouns = He/Him or They/Them | Website = [https://sharparam.com sharparam.com] | Socials = GitHub, Reddit, Discord | Socials_columns = 3 | GitHub = [https://github.com/Sharparam Sharparam] | Reddit = [https://reddit.com/u/Sharparam Sharparam] | Discord = sharparam }} Hello, I am '''Sharparam'''! I use my /sandbox..." wikitext text/x-wiki {{#invoke:infobox|main | title = Sharparam | image = [[File:Sharparam.png|300px|link=]] | sections = Basic Info,Socials | Basic Info = Pronouns, Website | Pronouns = He/Him or They/Them | Website = [https://sharparam.com sharparam.com] | Socials = GitHub, Reddit, Discord | Socials_columns = 3 | GitHub = [https://github.com/Sharparam Sharparam] | Reddit = [https://reddit.com/u/Sharparam Sharparam] | Discord = sharparam }} Hello, I am '''Sharparam'''! I use my [[/sandbox|sandbox]] to test stuff. == Data mining == The results of my data mining attempts can be found in a [https://drive.google.com/drive/folders/1UXX_9w59D19ZmgBzf_bN6tIHxZuyJdWx?usp=sharing Shared GDrive folder]. == My user styles and scripts == === Styles === * [[/common.css]] === Scripts === * [[/common.js]] == MediaWiki "bookmarks" == * [[MediaWiki:Common.css]] * [[MediaWiki:Vector.css]] 735978aec72a43447f01b77eefc887f01ca6ee63 Bleak Faith: Forsaken Wiki/external 0 8 387 15 2025-08-20T23:30:01Z Sharparam 284703 Replace example links with Bleak Faith links wikitext text/x-wiki {{Main page box/start | title = External links }} <div class="mp-links columns-2"> * {{MP link|Official site|link=http://www.bleakfaith.com/}} * {{MP link|Discord|link=https://discord.com/invite/x7UCRbHAAq|image=Discord.svg|size=64x64px}} * {{MP link|Reddit|link=https://www.reddit.com/r/Bleak_Faith/|image=Reddit.svg|size=64x64px}} * {{MP link|Steam|link=https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/|image=Steam.svg|size=64x64px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 5bd796659a5bafa38b5bab3f000fecaaeaa472aa Module:Coordinates 828 296 388 2025-08-21T14:51:06Z Sharparam 284703 Created page with "local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or ''..." Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = tonumber(args.x or args[1]) or 0 local y = tonumber(args.y or args[2]) or 0 local z = tonumber(args.z or args[3]) or 0 local xdec = string.sub(tostring(math.fmod(x, 1)), 3) local ydec = string.sub(tostring(math.fmod(y, 1)), 3) local zdec = string.sub(tostring(math.fmod(z, 1)), 3) local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2 local tooltip = string.format("X: %d, Y: %d, Z: %d", x, y, z) local elem = mw.html.create('span') :css('border-bottom', '1px dotted') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if inaccurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end return elem end return p de47bf0e464009651055c19beae22b5024ae6aa3 397 388 2025-08-21T14:59:20Z Sharparam 284703 Fix tooltip display not showing decimals Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = tonumber(args.x or args[1]) or 0 local y = tonumber(args.y or args[2]) or 0 local z = tonumber(args.z or args[3]) or 0 local xdec = string.sub(tostring(math.fmod(x, 1)), 3) local ydec = string.sub(tostring(math.fmod(y, 1)), 3) local zdec = string.sub(tostring(math.fmod(z, 1)), 3) local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2 local tooltip = string.format("X: %.1f, Y: %.1f, Z: %.1f", x, y, z) local elem = mw.html.create('span') :css('border-bottom', '1px dotted') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if inaccurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end return elem end return p 2e9e52b2c3ce3d680e6c156a74e9794100f9de20 Template:Coordinates 10 297 389 2025-08-21T14:52:10Z Sharparam 284703 Created page with "{{#invoke:Coordinates|main}}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#invoke:Coordinates|main}}<noinclude>{{Documentation}}</noinclude> f6c5bc6a93e6c91ac2daccb423e3ca4e2e61b94f Template:Coordinates/doc 10 298 390 2025-08-21T14:52:43Z Sharparam 284703 Created page with "This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "des..." wikitext text/x-wiki This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> &rarr; {{Coordinates|x=12|y=50|z=-32}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> &rarr; {{Coordinates|16.5|42.5|-4.4}} 0374227811c51975a2c4f372bfd6877f1362368f 396 390 2025-08-21T14:56:54Z Sharparam 284703 Add some shorthand examples wikitext text/x-wiki This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> &rarr; {{Coordinates|x=12|y=50|z=-32}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> &rarr; {{Coordinates|16.5|42.5|-4.4}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.2|3.4|5.6}}</syntaxhighlight> &rarr; {{coords|1.2|3.4|5.6}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.5|4.3|2.1}}</syntaxhighlight> &rarr; {{pos|6.5|4.3|2.1}} 7af2ee703d6da0280470b4042899b8ff0fbb5115 Template:Coords 10 299 391 2025-08-21T14:53:49Z Sharparam 284703 Redirected page to [[Template:Coordinates]] wikitext text/x-wiki #REDIRECT [[Template:Coordinates]] b5be2dd4498d085b3d37c3f6a8be85ba839892d5 Template:Position 10 300 392 2025-08-21T14:54:07Z Sharparam 284703 Redirected page to [[Template:Coordinates]] wikitext text/x-wiki #REDIRECT [[Template:Coordinates]] b5be2dd4498d085b3d37c3f6a8be85ba839892d5 Template:Pos 10 301 393 2025-08-21T14:54:26Z Sharparam 284703 Redirected page to [[Template:Coordinates]] wikitext text/x-wiki #REDIRECT [[Template:Coordinates]] b5be2dd4498d085b3d37c3f6a8be85ba839892d5 Template:Coord 10 302 394 2025-08-21T14:54:43Z Sharparam 284703 Redirected page to [[Template:Coordinates]] wikitext text/x-wiki #REDIRECT [[Template:Coordinates]] b5be2dd4498d085b3d37c3f6a8be85ba839892d5 Template:Coordinate 10 303 395 2025-08-21T14:55:03Z Sharparam 284703 Redirected page to [[Template:Coordinates]] wikitext text/x-wiki #REDIRECT [[Template:Coordinates]] b5be2dd4498d085b3d37c3f6a8be85ba839892d5 Template:Yesno 10 304 398 2025-08-21T15:10:37Z Sharparam 284703 Created page with "{{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }} |no |n |false |0 = {{{no|<!-- null -->}}} | = {{{blank|{{{no|<!-- null -->}}}}}} |¬ = {{{¬|}}} |yes |y |true |1 = {{{yes|yes}}} |#default = {{{def|{{{yes|yes}}}}}} }}<noinclude> {{Documentation}} </noinclude>" wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }} |no |n |false |0 = {{{no|<!-- null -->}}} | = {{{blank|{{{no|<!-- null -->}}}}}} |¬ = {{{¬|}}} |yes |y |true |1 = {{{yes|yes}}} |#default = {{{def|{{{yes|yes}}}}}} }}<noinclude> {{Documentation}} </noinclude> 166fab9e5411aacd02ca4c9e93fbc7bf6bcf26ac Template:Sandbox other 10 305 399 2025-08-21T15:22:25Z Sharparam 284703 Created page with "{{#switch:{{SUBPAGENAME}}|sandbox|doc={{{1|}}}|#default={{{2|}}}}}<noinclude> {{documentation}} </noinclude>" wikitext text/x-wiki {{#switch:{{SUBPAGENAME}}|sandbox|doc={{{1|}}}|#default={{{2|}}}}}<noinclude> {{documentation}} </noinclude> 278877c2ad3ab9f7df5d91845dc67d2f4e2c6a46 Template:Sandbox other/doc 10 306 400 2025-08-21T15:23:28Z Sharparam 284703 Created page with "<!-- {{Documentation subpage}} --> <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> <templatedata> { "description": { "en": "This template displays different output on sandbox and documentation pages than other ones." }, "params": { "1": { "label": { "en": "Sandbox text" }, "description": { "en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but i..." wikitext text/x-wiki <!-- {{Documentation subpage}} --> <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> <templatedata> { "description": { "en": "This template displays different output on sandbox and documentation pages than other ones." }, "params": { "1": { "label": { "en": "Sandbox text" }, "description": { "en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but it may contain a link to the main template." }, "type": "content", "suggested": true }, "2": { "label": { "en": "Normal text" }, "description": { "en": "Text displayed everywhere except for sandbox and documentation subpages. Usually this contains categories for the template." }, "type": "content", "suggested": true } } } </templatedata> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Templates]] }}</includeonly> d4d9f60bd1d1c7555fdc8529a0039406cfd26726 Template:Yesno/doc 10 307 401 2025-08-21T15:23:49Z Sharparam 284703 Created page with "<!-- {{Documentation subpage}} --> <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> This template normalises an input to be a yes/no output. == Usage == The template has five possible outputs depending on the default parameter (input if you will). In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters). * {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no}}..." wikitext text/x-wiki <!-- {{Documentation subpage}} --> <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> This template normalises an input to be a yes/no output. == Usage == The template has five possible outputs depending on the default parameter (input if you will). In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters). * {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no}} → "" (also applies to "No", "NO", "nO", "N", "n" and "0") * {{Tlx|Yesno}} → "" * {{Tlx|Yesno|¬}} → "" * {{Tlx|Yesno|purplemonkeydishwasher}} → "yes" (also applies to any other value not given above) Each of these can be over-ridden. * {{Tlx|Yesno|yes|yes{{=}}bacon}} → "{{Yesno|yes|yes=bacon}}" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no|no{{=}}ham}} → "{{Yesno|no|no=ham}}" (also applies to "No", "NO", "nO", "N", "n" and "0") * {{Tlx|Yesno||blank{{=}}eggs}} → "{{Yesno||blank=eggs}}" ** but {{Tlx|Yesno||no{{=}}ham}} → "{{Yesno||no=ham}}" ** and {{Tlx|Yesno||blank{{=}}eggs|no{{=}}ham}} → "{{Yesno||blank=eggs|no=ham}}" * {{Tlx|Yesno|¬|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬|¬=sausage|blank=eggs|no=ham}}" ** and {{Tlx|Yesno|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬=sausage|blank=eggs|no=ham}}" * {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}} → "{{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}}" (also applies to any other value not given above) ** but {{Tlx|Yesno|purplemonkeydishwasher|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|yes=bacon}}" ** and {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|def=cup-of-tea|yes=bacon}}" This may be used (apparently perversely) thus: * {{Tlx|Yesno|yes|yes{{=}}no|no{{=}}yes}} → "{{Yesno|yes|yes=no|no=yes}}" * {{Tlx|Yesno|no|yes{{=}}no|no{{=}}yes}} → "{{Yesno|no|yes=no|no=yes}}" This creates a logical inversion. == TemplateData == <!-- {{TemplateData header}} --> <templatedata> { "description": { "en": "This template normalises an input to be a yes or nil output." }, "format": "inline", "params": { "1": { "label": { "en": "Input value" }, "description": { "en": "The value to be evaluated." }, "type": "string", "required": true }, "yes": { "label": { "en": "Output on yes" }, "description": { "en": "Specifies the output of the template when the input value is a case-insensitive forms of 'Yes', 'Y', 'True' or '1'." }, "type": "string", "required": false }, "no": { "label": { "en": "Output on no" }, "description": { "en": "Specifies the output of the template when the input value is a case-insensitive forms of 'No', 'N', 'False', or '0'." }, "type": "string", "required": false }, "blank": { "label": { "en": "Output on blank input" }, "description": { "en": "Specifies the output of the template when the input value is defined but is either empty or contains nothing but whitespace character(s)." }, "type": "string", "required": false }, "¬": { "label": { "en": "Output on ¬" }, "description": { "en": "Specifies the output of the template when the input value is either '¬' or entirely missing (undefined)." }, "type": "string", "required": false }, "def": { "label": { "en": "Definite output" }, "description": { "en": "Specifies the output of the template when the input value is defined but not a form of 'yes', 'no', '1', '0', '¬' or blank." }, "type": "string", "required": false } } } </templatedata> == See also == * [[Module:Yesno]] <includeonly>{{Sandbox other|| <!-- CATEGORIES AND INTERWIKIS HERE, THANKS --> [[Category:Utility templates]] }}</includeonly> 5715454d5a5aa65485043e4addc761a7d31454a5 Category:Utility templates 14 308 402 2025-08-21T15:24:23Z Sharparam 284703 Created page with "Utility templates for editing." wikitext text/x-wiki Utility templates for editing. 1efcbd3d8e1b3f909b9b968892e50b13cda3f04e Module:Yesno 828 309 403 2025-08-21T15:25:12Z Sharparam 284703 Created page with "-- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val =..." Scribunto text/plain -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or tonumber(val) == 0 then return false else return default end end f767643e7d12126d020d88d662a3dd057817b9dc Module:Yesno/doc 828 310 404 2025-08-21T15:36:10Z Sharparam 284703 Created page with "<noinclude><!-- --><!--{{#ifeq:{{SUBPAGENAME}}|doc||{{Documentation subpage}}}}--><!-- --></noinclude> <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "1", "0", "yes", "no", etc...." wikitext text/x-wiki <noinclude><!-- --><!--{{#ifeq:{{SUBPAGENAME}}|doc||{{Documentation subpage}}}}--><!-- --></noinclude> <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "1", "0", "yes", "no", etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns <code>nil</code> values as <code>nil</code>, to allow for distinctions between <code>nil</code> and <code>false</code>. The module also accepts other Lua structures as input, i.e. booleans, numbers, tables, and functions. If it is passed input that it does not recognise as boolean or <code>nil</code>, it is possible to specify a default value to return. == Syntax == <syntaxhighlight lang="lua"> yesno(value, default) </syntaxhighlight> <code>value</code> is the value to be tested. Boolean input or boolean-style input (see below) always evaluates to either <code>true</code> or <code>false</code>, and <code>nil</code> always evaluates to <code>nil</code>. Other values evaluate to <code>default</code>. == Usage == First, load the module. Note that it can only be loaded from other Lua modules, not from normal wiki pages. For normal wiki pages you can use {{tlx|yesno}} instead. <syntaxhighlight lang="lua"> local yesno = require('Module:Yesno') </syntaxhighlight> Some input values always return <code>true</code>, and some always return <code>false</code>. <code>nil</code> values always return <code>nil</code>. <syntaxhighlight lang="lua"> -- These always return true: yesno('yes') yesno('y') yesno('true') yesno('t') yesno('1') yesno(1) yesno(true) -- These always return false: yesno('no') yesno('n') yesno('false') yesno('f') yesno('0') yesno(0) yesno(false) -- A nil value always returns nil: yesno(nil) </syntaxhighlight> String values are converted to lower case before they are matched: <syntaxhighlight lang="lua"> -- These always return true: yesno('Yes') yesno('YES') yesno('yEs') yesno('Y') yesno('tRuE') -- These always return false: yesno('No') yesno('NO') yesno('nO') yesno('N') yesno('fALsE') </syntaxhighlight> You can specify a default value if <code>yesno</code> receives input other than that listed above. If you don't supply a default, the module will return <code>nil</code> for these inputs. <syntaxhighlight lang="lua"> -- These return nil: yesno('foo') yesno({}) yesno(5) yesno(function() return 'This is a function.' end) -- These return true: yesno('foo', true) yesno({}, true) yesno(5, true) yesno(function() return 'This is a function.' end, true) -- These return "bar": yesno('foo', 'bar') yesno({}, 'bar') yesno(5, 'bar') yesno(function() return 'This is a function.' end, 'bar') </syntaxhighlight> Note that the blank string also functions this way: <syntaxhighlight lang="lua"> yesno('') -- Returns nil. yesno('', true) -- Returns true. yesno('', 'bar') -- Returns "bar". </syntaxhighlight> Although the blank string usually evaluates to <code>false</code> in wikitext, it evaluates to <code>true</code> in Lua. This module prefers the Lua behaviour over the wikitext behaviour. If treating the blank string as <code>false</code> is important for your module, you will need to remove blank arguments at an earlier stage of processing. <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Modules]] }}</includeonly><noinclude> [[Category:Module documentation pages]] </noinclude> f0ef7ef64ea0756ea01bcaa9847ceca9782026b5 Template:About 10 311 405 2025-08-21T15:41:21Z Sharparam 284703 Redirected page to [[Template:Disambiguation]] wikitext text/x-wiki #REDIRECT [[Template:Disambiguation]] 42512ae1befdd6da09e528969fc1aff8da1c9a01 448 405 2025-08-21T16:25:56Z Sharparam 284703 1 revision imported: Imported from Wikipedia wikitext text/x-wiki #REDIRECT [[Template:Disambiguation]] 42512ae1befdd6da09e528969fc1aff8da1c9a01 449 448 2025-08-21T16:27:25Z Sharparam 284703 Use WP About template source wikitext text/x-wiki {{#invoke:about|about}}<noinclude> {{Documentation}} </noinclude> 34b07e47d9b8220bf56dd9882945ad464b21a731 Module:Arguments 828 312 406 2025-08-21T15:46:08Z Sharparam 284703 Created page with "-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string'..." Scribunto text/plain -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments 3134ecce8429b810d445e29eae115e2ae4c36c53 Module:Arguments/doc 828 313 407 2025-08-21T15:48:06Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:Arguments|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:Arguments|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude> 28b94b568a78688d3d0ac27f55e89b64d30cbc2c Module:Redirect 828 314 408 2025-08-21T15:52:26Z Sharparam 284703 Created page with "-- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redi..." Scribunto text/plain -- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redirect. function p.getTargetFromText(text) local target = string.match( text, "^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]" ) or string.match( text, "^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]" ) return target and mw.uri.decode(target, 'PATH') end -- Gets the target of a redirect. If the page specified is not a redirect, -- returns nil. function p.getTarget(page, fulltext) -- Get the title object. Both page names and title objects are allowed -- as input. local titleObj if type(page) == 'string' or type(page) == 'number' then titleObj = getTitle(page) elseif type(page) == 'table' and type(page.getContent) == 'function' then titleObj = page else error(string.format( "bad argument #1 to 'getTarget'" .. " (string, number, or title object expected, got %s)", type(page) ), 2) end if not titleObj then return nil end local targetTitle = titleObj.redirectTarget if targetTitle then if fulltext then return targetTitle.fullText else return targetTitle.prefixedText end else return nil end end --[[ -- Given a single page name determines what page it redirects to and returns the -- target page name, or the passed page name when not a redirect. The passed -- page name can be given as plain text or as a page link. -- -- Returns page name as plain text, or when the bracket parameter is given, as a -- page link. Returns an error message when page does not exist or the redirect -- target cannot be determined for some reason. --]] function p.luaMain(rname, bracket, fulltext) if type(rname) ~= "string" or not rname:find("%S") then return nil end bracket = bracket and "[[%s]]" or "%s" rname = rname:match("%[%[(.+)%]%]") or rname local target = p.getTarget(rname, fulltext) local ret = target or rname ret = getTitle(ret) if ret then if fulltext then ret = ret.fullText else ret = ret.prefixedText end return bracket:format(ret) else return nil end end -- Provides access to the luaMain function from wikitext. function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) return p.luaMain(args[1], args.bracket, args.fulltext) or '' end -- Returns true if the specified page is a redirect, and false otherwise. function p.luaIsRedirect(page) local titleObj = getTitle(page) if not titleObj then return false end if titleObj.isRedirect then return true else return false end end -- Provides access to the luaIsRedirect function from wikitext, returning 'yes' -- if the specified page is a redirect, and the blank string otherwise. function p.isRedirect(frame) local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) if p.luaIsRedirect(args[1]) then return 'yes' else return '' end end return p a224c45940343d66f49a78b0a39b2045e2c45d20 Category:Utility modules 14 315 409 2025-08-21T15:55:00Z Sharparam 284703 Created page with "Utility Lua modules." wikitext text/x-wiki Utility Lua modules. 0aa79c3b49606d401d8b0a12fa6c596e821621d8 Category:Module documentation pages 14 316 410 2025-08-21T15:55:36Z Sharparam 284703 Created page with "Pages that document usage for Lua modules." wikitext text/x-wiki Pages that document usage for Lua modules. 85aa5bf005bae53b26da6d5726824c4daf1e9ab5 Module:Redirect/doc 828 317 411 2025-08-21T15:56:47Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:Redirect|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:Redirect|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude> [[Category:Module documentation pages]] </noinclude> 436eeeb7a653286c92f328a118549b21f6c450a5 Module:Wikitext Parsing 828 318 412 2025-08-21T16:00:52Z Sharparam 284703 Created page with "require("strict") --Helper functions local function startswith(text, subtext) return string.sub(text, 1, #subtext) == subtext end local function endswith(text, subtext) return string.sub(text, -#subtext, -1) == subtext end local function allcases(s) return s:gsub("%a", function(c) return "["..c:upper()..c:lower().."]" end) end local trimcache = {} local whitespace = {[" "]=1, ["\n"]=1, ["\t"]=1, ["\r"]=1} local function cheaptrim(str) --mw.text.trim is surprising..." Scribunto text/plain require("strict") --Helper functions local function startswith(text, subtext) return string.sub(text, 1, #subtext) == subtext end local function endswith(text, subtext) return string.sub(text, -#subtext, -1) == subtext end local function allcases(s) return s:gsub("%a", function(c) return "["..c:upper()..c:lower().."]" end) end local trimcache = {} local whitespace = {[" "]=1, ["\n"]=1, ["\t"]=1, ["\r"]=1} local function cheaptrim(str) --mw.text.trim is surprisingly expensive, so here's an alternative approach local quick = trimcache[str] if quick then return quick else -- local out = string.gsub(str, "^%s*(.-)%s*$", "%1") local lowEnd local strlen = #str for i = 1,strlen do if not whitespace[string.sub(str, i, i)] then lowEnd = i break end end if not lowEnd then trimcache[str] = "" return "" end for i = strlen,1,-1 do if not whitespace[string.sub(str, i, i)] then local out = string.sub(str, lowEnd, i) trimcache[str] = out return out end end end end --[=[ Implementation notes ---- NORMAL HTML TAGS ---- Tags are very strict on how they want to start, but loose on how they end. The start must strictly follow <[tAgNaMe](%s|>) with no room for whitespace in the tag's name, but may then flow as they want afterwards, making <div\nclass\n=\n"\nerror\n"\n> valid There's no sense of escaping < or > E.g. <div class="error\>"> will end at \> despite it being inside a quote <div class="<span class="error">error</span>"> will not process the larger div If a tag has no end, it will consume all text instead of not processing ---- NOPROCESSING TAGS (nowiki, pre, syntaxhighlight, source, etc.) ---- (In most comments, <source> will not be mentioned. This is because it is the deprecated version of <syntaxhighlight>) No-Processing tags have some interesting differences to the above rules. For example, their syntax is a lot stricter. While an opening tag appears to follow the same set of rules, A closing tag can't have any sort of extra formatting period. While </div a/a> is valid, </nowiki a/a> isn't - only newlines and spaces/tabs are allowed in closing tags. Note that, even though <pre> tags cause a visual change when the ending tag has extra formatting, it won't cause the no-processing effects. For some reason, the format must be strict for that to apply. Both the content inside the tag pair and the content inside each side of the pair is not processed. E.g. <nowiki |}}>|}}</nowiki> would have both of the |}} escaped in practice. When something in the code is referenced to as a "Nowiki Tag", it means a tag which causes wiki text to not be processed, which includes <nowiki>, <pre>, and <syntaxhighlight> Since we only care about these tags, we can ignore the idea of an intercepting tag preventing processing, and just go straight for the first ending we can find If there is no ending to find, the tag will NOT consume the rest of the text in terms of processing behaviour (though <pre> will appear to have an effect). Even if there is no end of the tag, the content inside the opening half will still be unprocessed, meaning {{X20|<nowiki }}>}} wouldn't end at the first }} despite there being no ending to the tag. Note that there are some tags, like <math>, which also function like <nowiki> which are included in this aswell. Some other tags, like <ref>, have far too unpredictable behaviour to be handled currently (they'd have to be split and processed as something seperate - its complicated, but maybe not impossible.) I suspect that every tag listed in [[Special:Version]] may behave somewhat like this, but that's far too many cases worth checking for rarely used tags that may not even have a good reason to contain {{ or }} anyways, so we leave them alone. ---- HTML COMMENTS AND INCLUDEONLY ---- HTML Comments are about as basic as it could get for this Start at <!--, end at -->, no extra conditions. Simple enough If a comment has no end, it will eat all text instead of not being processed includeonly tags function mostly like a regular nowiki tag, with the exception that the tag will actually consume all future text if not given an ending as opposed to simply giving up and not changing anything. Due to complications and the fact that this is far less likely to be present on a page, aswell as being something that may not want to be escaped, includeonly tags are ignored during our processing --]=] local validtags = {nowiki=1, pre=1, syntaxhighlight=1, source=1, math=1} --This function expects the string to start with the tag local function TestForNowikiTag(text, scanPosition) local tagName = (string.match(text, "^<([^\n />]+)", scanPosition) or ""):lower() if not validtags[tagName] then return nil end local nextOpener = string.find(text, "<", scanPosition+1) or -1 local nextCloser = string.find(text, ">", scanPosition+1) or -1 if nextCloser > -1 and (nextOpener == -1 or nextCloser < nextOpener) then local startingTag = string.sub(text, scanPosition, nextCloser) --We have our starting tag (E.g. '<pre style="color:red">') --Now find our ending... if endswith(startingTag, "/>") then --self-closing tag (we are our own ending) return { Tag = tagName, Start = startingTag, Content = "", End = "", Length = #startingTag } else local endingTagStart, endingTagEnd = string.find(text, "</"..allcases(tagName).."[ \t\n]*>", scanPosition) if endingTagStart then --Regular tag formation local endingTag = string.sub(text, endingTagStart, endingTagEnd) local tagContent = string.sub(text, nextCloser+1, endingTagStart-1) return { Tag = tagName, Start = startingTag, Content = tagContent, End = endingTag, Length = #startingTag + #tagContent + #endingTag } else --Content inside still needs escaping (also linter error!) return { Tag = tagName, Start = startingTag, Content = "", End = "", Length = #startingTag } end end end return nil end local function TestForComment(text, scanPosition) --Like TestForNowikiTag but for <!-- --> if string.match(text, "^<!%-%-", scanPosition) then local commentEnd = string.find(text, "-->", scanPosition+4, true) if commentEnd then return { Start = "<!--", End = "-->", Content = string.sub(text, scanPosition+4, commentEnd-1), Length = commentEnd-scanPosition+3 } else --Consumes all text if not given an ending return { Start = "<!--", End = "", Content = string.sub(text, scanPosition+4), Length = #text-scanPosition+1 } end end return nil end --[[ Implementation notes The goal of this function is to escape all text that wouldn't be parsed if it was preprocessed (see above implementation notes). Using keepComments will keep all HTML comments instead of removing them. They will still be escaped regardless to avoid processing errors --]] local function PrepareText(text, keepComments) local newtext = {} local scanPosition = 1 while true do local NextCheck = string.find(text, "<[NnSsPpMm!]", scanPosition) --Advance to the next potential tag we care about if not NextCheck then --Done newtext[#newtext+1] = string.sub(text,scanPosition) break end newtext[#newtext+1] = string.sub(text,scanPosition,NextCheck-1) scanPosition = NextCheck local Comment = TestForComment(text, scanPosition) if Comment then if keepComments then newtext[#newtext+1] = Comment.Start .. mw.text.nowiki(Comment.Content) .. Comment.End end scanPosition = scanPosition + Comment.Length else local Tag = TestForNowikiTag(text, scanPosition) if Tag then local newTagStart = "<" .. mw.text.nowiki(string.sub(Tag.Start,2,-2)) .. ">" local newTagEnd = Tag.End == "" and "" or --Respect no tag ending "</" .. mw.text.nowiki(string.sub(Tag.End,3,-2)) .. ">" local newContent = mw.text.nowiki(Tag.Content) newtext[#newtext+1] = newTagStart .. newContent .. newTagEnd scanPosition = scanPosition + Tag.Length else --Nothing special, move on... newtext[#newtext+1] = string.sub(text, scanPosition, scanPosition) scanPosition = scanPosition + 1 end end end return table.concat(newtext, "") end --[=[ Implementation notes This function is an alternative to Transcluder's getParameters which considers the potential for a singular { or } or other odd syntax that %b doesn't like to be in a parameter's value. When handling the difference between {{ and {{{, mediawiki will attempt to match as many sequences of {{{ as possible before matching a {{ E.g. {{{{A}}}} -> { {{{A}}} } {{{{{{{{Text|A}}}}}}}} -> {{ {{{ {{{Text|A}}} }}} }} If there aren't enough triple braces on both sides, the parser will compromise for a template interpretation. E.g. {{{{A}} }} -> {{ {{ A }} }} While there are technically concerns about things such as wikilinks breaking template processing (E.g. {{[[}}]]}} doesn't stop at the first }}), it shouldn't be our job to process inputs perfectly when the input has garbage ({ / } isn't legal in titles anyways, so if something's unmatched in a wikilink, it's guaranteed GIGO) Setting dontEscape will prevent running the input text through EET. Avoid setting this to true if you don't have to set it. Returned values: A table of all templates. Template data goes as follows: Text: The raw text of the template Name: The name of the template Args: A list of arguments Children: A list of immediate template children --]=] --Helper functions local function boundlen(pair) return pair.End-pair.Start+1 end --Main function local function ParseTemplates(InputText, dontEscape) --Setup if not dontEscape then InputText = PrepareText(InputText) end local function finalise(text) if not dontEscape then return mw.text.decode(text) else return text end end local function CreateContainerObj(Container) Container.Text = {} Container.Args = {} Container.ArgOrder = {} Container.Children = {} -- Container.Name = nil -- Container.Value = nil -- Container.Key = nil Container.BeyondStart = false Container.LastIndex = 1 Container.finalise = finalise function Container:HandleArgInput(character, internalcall) if not internalcall then self.Text[#self.Text+1] = character end if character == "=" then if self.Key then self.Value[#self.Value+1] = character else self.Key = cheaptrim(self.Value and table.concat(self.Value, "") or "") self.Value = {} end else --"|" or "}" if not self.Name then self.Name = cheaptrim(self.Value and table.concat(self.Value, "") or "") self.Value = nil else self.Value = self.finalise(self.Value and table.concat(self.Value, "") or "") if self.Key then self.Key = self.finalise(self.Key) self.Args[self.Key] = cheaptrim(self.Value) self.ArgOrder[#self.ArgOrder+1] = self.Key else local Key = tostring(self.LastIndex) self.Args[Key] = self.Value self.ArgOrder[#self.ArgOrder+1] = Key self.LastIndex = self.LastIndex + 1 end self.Key = nil self.Value = nil end end end function Container:AppendText(text, ftext) self.Text[#self.Text+1] = (ftext or text) if not self.Value then self.Value = {} end self.BeyondStart = self.BeyondStart or (#table.concat(self.Text, "") > 2) if self.BeyondStart then self.Value[#self.Value+1] = text end end function Container:Clean(IsTemplate) self.Text = table.concat(self.Text, "") if self.Value and IsTemplate then self.Value = {string.sub(table.concat(self.Value, ""), 1, -3)} --Trim ending }} self:HandleArgInput("|", true) --Simulate ending end self.Value = nil self.Key = nil self.BeyondStart = nil self.LastIndex = nil self.finalise = nil self.HandleArgInput = nil self.AppendText = nil self.Clean = nil end return Container end --Step 1: Find and escape the content of all wikilinks on the page, which are stronger than templates (see implementation notes) local scannerPosition = 1 local wikilinks = {} local openWikilinks = {} while true do local Position, _, Character = string.find(InputText, "([%[%]])%1", scannerPosition) if not Position then --Done break end scannerPosition = Position+2 --+2 to pass the [[ / ]] if Character == "[" then --Add a [[ to the pending wikilink queue openWikilinks[#openWikilinks+1] = Position else --Pair up the ]] to any available [[ if #openWikilinks >= 1 then local start = table.remove(openWikilinks) --Pop the latest [[ wikilinks[start] = {Start=start, End=Position+1, Type="Wikilink"} --Note the pair end end end --Step 2: Find the bounds of every valid template and variable ({{ and {{{) local scannerPosition = 1 local templates = {} local variables = {} local openBrackets = {} while true do local Start, _, Character = string.find(InputText, "([{}])%1", scannerPosition) if not Start then --Done (both 9e9) break end local _, End = string.find(InputText, "^"..Character.."+", Start) scannerPosition = Start --Get to the {{ / }} set if Character == "{" then --Add the {{+ set to the queue openBrackets[#openBrackets+1] = {Start=Start, End=End} else --Pair up the }} to any available {{, accounting for {{{ / }}} local BracketCount = End-Start+1 while BracketCount >= 2 and #openBrackets >= 1 do local OpenSet = table.remove(openBrackets) if boundlen(OpenSet) >= 3 and BracketCount >= 3 then --We have a {{{variable}}} (both sides have 3 spare) variables[OpenSet.End-2] = {Start=OpenSet.End-2, End=scannerPosition+2, Type="Variable"} --Done like this to ensure chronological order BracketCount = BracketCount - 3 OpenSet.End = OpenSet.End - 3 scannerPosition = scannerPosition + 3 else --We have a {{template}} (both sides have 2 spare, but at least one side doesn't have 3 spare) templates[OpenSet.End-1] = {Start=OpenSet.End-1, End=scannerPosition+1, Type="Template"} --Done like this to ensure chronological order BracketCount = BracketCount - 2 OpenSet.End = OpenSet.End - 2 scannerPosition = scannerPosition + 2 end if boundlen(OpenSet) >= 2 then --Still has enough data left, leave it in openBrackets[#openBrackets+1] = OpenSet end end end scannerPosition = End --Now move past the bracket set end --Step 3: Re-trace every object using their known bounds, collecting our parameters with (slight) ease local scannerPosition = 1 local activeObjects = {} local finalObjects = {} while true do local LatestObject = activeObjects[#activeObjects] --Commonly needed object local NNC, _, Character --NNC = NextNotableCharacter if LatestObject then NNC, _, Character = string.find(InputText, "([{}%[%]|=])", scannerPosition) else NNC, _, Character = string.find(InputText, "([{}])", scannerPosition) --We are only after templates right now end if not NNC then break end if NNC > scannerPosition and LatestObject then local scannedContent = string.sub(InputText, scannerPosition, NNC-1) LatestObject:AppendText(scannedContent, finalise(scannedContent)) end scannerPosition = NNC+1 if Character == "{" or Character == "[" then local Container = templates[NNC] or variables[NNC] or wikilinks[NNC] if Container then CreateContainerObj(Container) if Container.Type == "Template" then Container:AppendText("{{") scannerPosition = NNC+2 elseif Container.Type == "Variable" then Container:AppendText("{{{") scannerPosition = NNC+3 else --Wikilink Container:AppendText("[[") scannerPosition = NNC+2 end if LatestObject and Container.Type == "Template" then --Only templates count as children LatestObject.Children[#LatestObject.Children+1] = Container end activeObjects[#activeObjects+1] = Container elseif LatestObject then LatestObject:AppendText(Character) end elseif Character == "}" or Character == "]" then if LatestObject then LatestObject:AppendText(Character) if LatestObject.End == NNC then if LatestObject.Type == "Template" then LatestObject:Clean(true) finalObjects[#finalObjects+1] = LatestObject else LatestObject:Clean(false) end activeObjects[#activeObjects] = nil local NewLatest = activeObjects[#activeObjects] if NewLatest then NewLatest:AppendText(LatestObject.Text) --Append to new latest end end end else --| or = if LatestObject then LatestObject:HandleArgInput(Character) end end end --Step 4: Fix the order local FixedOrder = {} local SortableReference = {} for _,Object in next,finalObjects do SortableReference[#SortableReference+1] = Object.Start end table.sort(SortableReference) for i = 1,#SortableReference do local start = SortableReference[i] for n,Object in next,finalObjects do if Object.Start == start then finalObjects[n] = nil Object.Start = nil --Final cleanup Object.End = nil Object.Type = nil FixedOrder[#FixedOrder+1] = Object break end end end --Finished, return return FixedOrder end local p = {} --Main entry points p.PrepareText = PrepareText p.ParseTemplates = ParseTemplates --Extra entry points, not really required p.TestForNowikiTag = TestForNowikiTag p.TestForComment = TestForComment return p --[==[ console tests local s = [=[Hey!{{Text|<nowiki | ||> Hey! }} A</nowiki>|<!--AAAAA|AAA-->Should see|Shouldn't see}}]=] local out = p.PrepareText(s) mw.logObject(out) local s = [=[B<!-- Hey! -->A]=] local out = p.TestForComment(s, 2) mw.logObject(out); mw.log(string.sub(s, 2, out.Length)) local a = p.ParseTemplates([=[ {{User:Aidan9382/templates/dummy |A|B|C {{{A|B}}} { } } { |<nowiki>D</nowiki> |<pre>E |F</pre> |G|=|a=|A = [[{{PAGENAME}}|A=B]]{{Text|1==<nowiki>}}</nowiki>}}|A B=Success}} ]=]) mw.logObject(a) ]==] 0e960df7b62b2131c8e704eb249b7ce1654ad5c3 Module:Wikitext Parsing/doc 828 319 413 2025-08-21T16:01:43Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:Wikitext Parsing|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:Wikitext Parsing|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude> ac42eaa08fed582c3bee9fe96d8926c3a348bd4c Module:Disambiguation/templates 828 320 414 2025-08-21T16:06:25Z Sharparam 284703 Created page with "-- This page contains a table of all disambiguation templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["Disambiguation"] = true, -- ["DAB"] = true, -- ["Dab"] = true, -- ["Dab page"] = true, -- ["Dabpage"] = true, -- ["Dbig"] = true, -- ["Dis"] = true, -- ["Disam"] = true, -- ["Disamb"] = true, -- ["Disambig"] =..." Scribunto text/plain -- This page contains a table of all disambiguation templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["Disambiguation"] = true, -- ["DAB"] = true, -- ["Dab"] = true, -- ["Dab page"] = true, -- ["Dabpage"] = true, -- ["Dbig"] = true, -- ["Dis"] = true, -- ["Disam"] = true, -- ["Disamb"] = true, -- ["Disambig"] = true, -- ["Disambig misspelling"] = true, -- ["Disambiguation page"] = true, -- ["Project disambiguation"] = true, -- ["Shortcut disambig"] = true, -- ["Disambiguation cleanup"] = true, -- ["Cleanup disambig"] = true, -- ["Cleanup disambiguation"] = true, -- ["CleanupDisambig"] = true, -- ["Dab cleanup"] = true, -- ["Dab-cleanup"] = true, -- ["Dabclean"] = true, -- ["Disamb-cleanup"] = true, -- ["Disambcleanup"] = true, -- ["Disambig cleanup"] = true, -- ["Disambig-cleanup"] = true, -- ["Disambig-CU"] = true, -- ["Disambig-cu"] = true, -- ["Disambigcleanup"] = true, -- ["Disambiguate-cleanup"] = true, -- ["Disambiguation-cleanup"] = true, -- ["Template disambiguation"] = true, -- ["Template ambiguous"] = true, -- ["Template dab"] = true, -- ["Template disambig"] = true } a19e74ebb8bfa5dd246ddd3c8e8c7856e6846121 Module:Disambiguation/templates/doc 828 321 415 2025-08-21T16:07:04Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:Disambiguation/templates|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:Disambiguation/templates|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude> bb28f1f1a9660ec5d6848300320ed9d8d83cca8a Module:Disambiguation 828 322 416 2025-08-21T16:07:30Z Sharparam 284703 Created page with "local p = {} local mRedirect = require('Module:Redirect') local disambiguationTemplates = mw.loadData('Module:Disambiguation/templates') local PrepareText = require('Module:Wikitext Parsing').PrepareText local function capitalize(s) -- This function only works on ASCII strings. If your wiki has -- disambiguation templates that use Unicode strings, use the commented-out -- line instead. Enwiki uses ASCII string manipulation only here to improve -- performance. retur..." Scribunto text/plain local p = {} local mRedirect = require('Module:Redirect') local disambiguationTemplates = mw.loadData('Module:Disambiguation/templates') local PrepareText = require('Module:Wikitext Parsing').PrepareText local function capitalize(s) -- This function only works on ASCII strings. If your wiki has -- disambiguation templates that use Unicode strings, use the commented-out -- line instead. Enwiki uses ASCII string manipulation only here to improve -- performance. return s:sub(1, 1):upper() .. s:sub(2, -1) -- return mw.ustring.upper(mw.ustring.sub(1, 1)) .. mw.ustring.sub(2, -1) end local function isDisambiguationTemplate(template) return disambiguationTemplates[capitalize(template)] or false end p.isDisambiguation = function(content) -- false if there is no content if content == nil then return false end -- redirects are not disambiguation pages if mRedirect.getTargetFromText(content) ~= nil then return false end -- check for disambiguation templates in the content local templateNames = {} -- remove nowiki content and html comments for this check local activecontent = PrepareText(content) for template in string.gmatch(activecontent, "{{%s*([^|}]-)%s*[|}]") do if isDisambiguationTemplate(template) then return true end end -- check for magic word if string.find(content, "__DISAMBIG__", 1, true) ~= nil then return true end return false end p._isDisambiguationPage = function(page) -- Look "(disambiguation)" in the title if string.find(page, "(disambiguation)",0,true) ~= nil then return true; end -- Look for disamiguation template in page content local title = mw.title.new(page) if not title then return false end local content = title:getContent() return p.isDisambiguation(content) end -- Entry points for templates p.isDisambiguationPage = function(frame) local title = frame.args[1] return p._isDisambiguationPage(title) and "yes" or "" end return p 8095747d2821274b0f3dbe8e4bfff65ac7787407 Module:Disambiguation/doc 828 323 417 2025-08-21T16:08:23Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:Disambiguation|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude>[[Category:Module documentation pages]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:Disambiguation|Module and documentation on Wikipedia]] <includeonly>{{Sandbox other|| [[Category:Utility modules]] }}</includeonly> <noinclude>[[Category:Module documentation pages]]</noinclude> 0f383624152331145768651c39cb19c828697ea9 MediaWiki:Sidebar 8 324 418 2025-08-21T16:21:20Z Sharparam 284703 Add import and export links wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help-mediawiki * sidebar-customizing-wiki ** MediaWiki:Sidebar|sidebar-edit-sidebar ** MediaWiki:Common.css|sidebar-edit-common-css ** MediaWiki:Vector.css|sidebar-edit-vector-css ** MediaWiki:Common.js|sidebar-edit-common-js ** Special:Gadgets|sidebar-gadgets ** Special:Import|sidebar-special-import ** Special:Export|sidebar-special-export ** Special:AllPages|sidebar-all-pages ** Special:SpecialPages|sidebar-special-pages * wiki.gg ** support:|sidebar-support-wiki ** Wikigg-ticket-link|sidebar-submit-ticket ** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar 4650a34e226dda6dd5e60c0168ab899130e28b31 MediaWiki:Sidebar-special-import 8 325 419 2025-08-21T16:22:53Z Sharparam 284703 Created page with "Import" wikitext text/x-wiki Import d6fbc9d2bdd580e18ed0bc5805dc26db323d6f5f MediaWiki:Sidebar-special-export 8 326 420 2025-08-21T16:23:11Z Sharparam 284703 Created page with "Export" wikitext text/x-wiki Export f3e4fadb9e370a1e2c0c622c01fc8c77daf93a2c Module:Exponential search 828 327 422 421 2025-08-21T16:23:41Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, lower, upper) else upper = i i = midPoint(lower, upper) return search(testFunc, i, lower, upper) end end return function (testFunc, init) checkType('Exponential search', 1, testFunc, 'function') checkType('Exponential search', 2, init, 'number', true) if init and (init < 1 or init ~= floor(init) or init == math.huge) then error(string.format( "invalid init value '%s' detected in argument #2 to " .. "'Exponential search' (init value must be a positive integer)", tostring(init) ), 2) end init = init or 2 if not testFunc(1) then return nil end return search(testFunc, init, 1, nil) end a9037be0c44536be79b2d7a26155bfb907368ae7 Module:TableTools 828 328 424 423 2025-08-21T16:23:42Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v elseif not exists[v] then ret[#ret + 1] = v exists[v] = true end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) if type(orig) ~= "table" then return orig end -- already_seen stores copies of tables indexed by the original table. local copy = already_seen[orig] if copy ~= nil then return copy end copy = {} already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then setmetatable(copy, _deepCopy(mt, true, already_seen)) end end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen or {}) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if searchElement is a member of the array, and false otherwise. -- Equivalent to JavaScript array.includes(searchElement) or -- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed ------------------------------------------------------------------------------------ function p.inArray(array, searchElement, fromIndex) checkType("inArray", 1, array, "table") -- if searchElement is nil, error? fromIndex = tonumber(fromIndex) if fromIndex then if (fromIndex < 0) then fromIndex = #array + fromIndex + 1 end if fromIndex < 1 then fromIndex = 1 end for _, v in ipairs({unpack(array, fromIndex)}) do if v == searchElement then return true end end else for _, v in pairs(array) do if v == searchElement then return true end end end return false end ------------------------------------------------------------------------------------ -- merge -- -- Given the arrays, returns an array containing the elements of each input array -- in sequence. ------------------------------------------------------------------------------------ function p.merge(...) local arrays = {...} local ret = {} for i, arr in ipairs(arrays) do checkType('merge', i, arr, 'table') for _, v in ipairs(arr) do ret[#ret + 1] = v end end return ret end ------------------------------------------------------------------------------------ -- extend -- -- Extends the first array in place by appending all elements from the second -- array. ------------------------------------------------------------------------------------ function p.extend(arr1, arr2) checkType('extend', 1, arr1, 'table') checkType('extend', 2, arr2, 'table') for _, v in ipairs(arr2) do arr1[#arr1 + 1] = v end end return p 27b6a4e23d902c05ad6e005059248318bffc2a4e Module:Namespace detect 828 329 426 425 2025-08-21T16:23:42Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p a4757000273064f151f0f22dc0e139092e5ff443 Module:Namespace detect/config 828 330 428 427 2025-08-21T16:23:42Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/data 828 331 430 429 2025-08-21T16:23:42Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:Pagetype 828 332 432 431 2025-08-21T16:23:42Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- This meta-module which automatically detects namespaces, and allows -- -- for a great deal of customisation. It can easily be ported to other -- -- wikis by changing the values in the [[Module:Pagetype/config]]. -- -- -- -------------------------------------------------------------------------------- -- Load config. local cfg = mw.loadData('Module:Pagetype/config') -- Load required modules. local yesno = require('Module:Yesno') local p = {} -- Look up a namespace argument in the args table. local function lookUpNamespaceArg(args, key) local arg = args[key] -- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave -- other values the same. return yesno(arg, arg) end -- Append multiple values to an array local function appendMultiple(target, source) for _, value in ipairs(source) do table.insert(target, value) end end -- Get argument keys for a title's namespace local function getNamespaceArgKeys(title) local nsInfo = mw.site.namespaces[title.namespace] local customAliases = cfg.customNamespaceAliases[title.namespace] or {} local keys = {} if nsInfo.name ~= '' then table.insert(keys, nsInfo.name) end if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then table.insert(keys, nsInfo.canonicalName) end appendMultiple(keys, nsInfo.aliases) appendMultiple(keys, customAliases) return keys end -- Get the argument for a title's namespace, if it was specified in the args table. local function getNamespaceArg(title, args) if title.isTalkPage then return lookUpNamespaceArg(args, cfg.talk) end for _, key in ipairs(getNamespaceArgKeys(title)) do local arg = lookUpNamespaceArg(args, mw.ustring.lower(key)) if arg ~= nil then return arg end end return nil end -- Look up a page type specific to the title's namespace local function getExplicitPageType(title) if title.isTalkPage then return cfg.talkDefault else return cfg.pagetypes[title.namespace] end end -- Get a default page type that is not specific to the title's namespace local function getDefaultPageType(args) local other = lookUpNamespaceArg(args, cfg.other) if type(other) == 'string' then return other else return cfg.otherDefault end end local function detectRedirects(title, args) local redirect = lookUpNamespaceArg(args, cfg.redirect) if redirect == false then -- Don't detect redirects if they have been specifically disallowed. return nil end -- Allow custom values for redirects. if not title.isRedirect then return nil elseif type(redirect) == 'string' then return redirect else return cfg.redirectDefault end end local function capitalize(pageType) local first = mw.ustring.sub(pageType, 1, 1) local rest = mw.ustring.sub(pageType, 2) return mw.ustring.upper(first) .. rest end local function pluralize(pageType) if cfg.irregularPlurals[pageType] then return cfg.irregularPlurals[pageType] else return pageType .. cfg.plural -- often 's' end end local function parseContent(title, args, optionsList) if title.namespace==828 and title.subpageText~='doc' -- don't detect modules or not title.exists -- can't check unless page exists then return nil end local content = title:getContent() if content == nil then return nil end local templates -- lazily evaluated for _, options in next, optionsList do local list, parameter, default, articleOnly = unpack(options, 1, 4) if not articleOnly or title.namespace==0 then -- only check for templates if we should... local out = lookUpNamespaceArg(args, parameter) if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them if not templates then templates = {} -- do our delayed evaluation now that we are required to content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do templates[#templates+1] = capitalize(template) end end local wantedTemplates = mw.loadData('Module:Pagetype/' .. list) local templateFound = false for _, template in next, templates do if wantedTemplates[template] then templateFound = true break end end if templateFound then if type(out)=='string' then return out elseif out ~= false and default then return default end end end end end end -- Find pages which do not exist local function nonExistent(title, args) local arg = lookUpNamespaceArg(args, cfg.ne) if arg == false then return nil end local exists = false if title.exists then -- not an article if it does not exist exists = true elseif title.namespace==8 and mw.message.new(title.text):exists() then exists = true elseif title.namespace==6 and title.fileExists then exists = true end if not exists then if type(arg) == 'string' then return arg else return cfg.naDefault end end end -- Get page types for mainspaces pages with an explicit class specified local function getMainNamespaceClassPageType(title, args) local class = args[1] if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match class = mw.ustring.lower(class) end local arg = lookUpNamespaceArg(args, cfg.na) if arg == false then -- don't check for this class if it is specifically disallowed return nil end if cfg.naAliases[class] then if type(arg) == 'string' then return arg else return cfg.naDefault end else return nil end end -- Get page type specified by an explicit namespace argument. local function getNamespaceArgPageType(title, args) local namespaceArg = getNamespaceArg(title, args) if namespaceArg == true then -- Namespace has been explicitly enabled, so return the default for -- this namespace return getExplicitPageType(title) elseif namespaceArg == false then -- Namespace has been explicitly disabled return getDefaultPageType(args) elseif namespaceArg then -- This namespaces uses custom text return namespaceArg else return nil end end -- Get page type not specified or detected by other means local function getOtherPageType(title, args) -- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes. local isInDefaultActiveNamespace = false local defaultNamespacesKey = args[cfg.defaultns] if defaultNamespacesKey == cfg.defaultnsAll then isInDefaultActiveNamespace = true else local defaultNamespaces if defaultNamespacesKey == cfg.defaultnsExtended then defaultNamespaces = cfg.extendedNamespaces elseif defaultNamespacesKey == cfg.defaultnsNone then defaultNamespaces = {} else defaultNamespaces = cfg.defaultNamespaces end isInDefaultActiveNamespace = defaultNamespaces[title.namespace] end if isInDefaultActiveNamespace then return getExplicitPageType(title) else return getDefaultPageType(args) end end function p._main(args) local title if args.page then title = mw.title.new(args.page) else title = mw.title.getCurrentTitle() end if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then title = title.subjectPageTitle end local pageType = detectRedirects(title, args) or nonExistent(title, args) or parseContent(title, args, { {'softredirect', cfg.softRedirect, cfg.softRedirectDefault}, {'setindex', cfg.sia, cfg.siaDefault, true}, {'disambiguation', cfg.dab, cfg.dabDefault, true}, {'rfd', cfg.rfd, cfg.rfdDefault}, }) or (title.namespace == 0 and getMainNamespaceClassPageType(title, args)) or getNamespaceArgPageType(title, args) or getOtherPageType(title, args) if yesno(args.plural, false) then pageType = pluralize(pageType) end if yesno(args.caps, false) then pageType = capitalize(pageType) end return pageType end function p.main(frame) local args = require('Module:Arguments').getArgs(frame) return p._main(args) end return p cb47b460d74d5df739ee7e300eeae512798bc475 451 432 2025-08-21T16:33:26Z Sharparam 284703 Disable some unused types Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- This meta-module which automatically detects namespaces, and allows -- -- for a great deal of customisation. It can easily be ported to other -- -- wikis by changing the values in the [[Module:Pagetype/config]]. -- -- -- -------------------------------------------------------------------------------- -- Load config. local cfg = mw.loadData('Module:Pagetype/config') -- Load required modules. local yesno = require('Module:Yesno') local p = {} -- Look up a namespace argument in the args table. local function lookUpNamespaceArg(args, key) local arg = args[key] -- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave -- other values the same. return yesno(arg, arg) end -- Append multiple values to an array local function appendMultiple(target, source) for _, value in ipairs(source) do table.insert(target, value) end end -- Get argument keys for a title's namespace local function getNamespaceArgKeys(title) local nsInfo = mw.site.namespaces[title.namespace] local customAliases = cfg.customNamespaceAliases[title.namespace] or {} local keys = {} if nsInfo.name ~= '' then table.insert(keys, nsInfo.name) end if nsInfo.canonicalName ~= nsInfo.name and nsInfo.canonicalName ~= '' then table.insert(keys, nsInfo.canonicalName) end appendMultiple(keys, nsInfo.aliases) appendMultiple(keys, customAliases) return keys end -- Get the argument for a title's namespace, if it was specified in the args table. local function getNamespaceArg(title, args) if title.isTalkPage then return lookUpNamespaceArg(args, cfg.talk) end for _, key in ipairs(getNamespaceArgKeys(title)) do local arg = lookUpNamespaceArg(args, mw.ustring.lower(key)) if arg ~= nil then return arg end end return nil end -- Look up a page type specific to the title's namespace local function getExplicitPageType(title) if title.isTalkPage then return cfg.talkDefault else return cfg.pagetypes[title.namespace] end end -- Get a default page type that is not specific to the title's namespace local function getDefaultPageType(args) local other = lookUpNamespaceArg(args, cfg.other) if type(other) == 'string' then return other else return cfg.otherDefault end end local function detectRedirects(title, args) local redirect = lookUpNamespaceArg(args, cfg.redirect) if redirect == false then -- Don't detect redirects if they have been specifically disallowed. return nil end -- Allow custom values for redirects. if not title.isRedirect then return nil elseif type(redirect) == 'string' then return redirect else return cfg.redirectDefault end end local function capitalize(pageType) local first = mw.ustring.sub(pageType, 1, 1) local rest = mw.ustring.sub(pageType, 2) return mw.ustring.upper(first) .. rest end local function pluralize(pageType) if cfg.irregularPlurals[pageType] then return cfg.irregularPlurals[pageType] else return pageType .. cfg.plural -- often 's' end end local function parseContent(title, args, optionsList) if title.namespace==828 and title.subpageText~='doc' -- don't detect modules or not title.exists -- can't check unless page exists then return nil end local content = title:getContent() if content == nil then return nil end local templates -- lazily evaluated for _, options in next, optionsList do local list, parameter, default, articleOnly = unpack(options, 1, 4) if not articleOnly or title.namespace==0 then -- only check for templates if we should... local out = lookUpNamespaceArg(args, parameter) if type(out) == "string" or (out ~= false and default) then -- ...and if we actually have anything to say about them if not templates then templates = {} -- do our delayed evaluation now that we are required to content = require('Module:Wikitext Parsing').PrepareText(content) -- disregard templates which do not have any affect for template in string.gmatch(content, "{{%s*([^|}]-)%s*[|}]") do templates[#templates+1] = capitalize(template) end end local wantedTemplates = mw.loadData('Module:Pagetype/' .. list) local templateFound = false for _, template in next, templates do if wantedTemplates[template] then templateFound = true break end end if templateFound then if type(out)=='string' then return out elseif out ~= false and default then return default end end end end end end -- Find pages which do not exist local function nonExistent(title, args) local arg = lookUpNamespaceArg(args, cfg.ne) if arg == false then return nil end local exists = false if title.exists then -- not an article if it does not exist exists = true elseif title.namespace==8 and mw.message.new(title.text):exists() then exists = true elseif title.namespace==6 and title.fileExists then exists = true end if not exists then if type(arg) == 'string' then return arg else return cfg.naDefault end end end -- Get page types for mainspaces pages with an explicit class specified local function getMainNamespaceClassPageType(title, args) local class = args[1] if type(class) == 'string' then -- Put in lower case so e.g. "na" and "NA" will both match class = mw.ustring.lower(class) end local arg = lookUpNamespaceArg(args, cfg.na) if arg == false then -- don't check for this class if it is specifically disallowed return nil end if cfg.naAliases[class] then if type(arg) == 'string' then return arg else return cfg.naDefault end else return nil end end -- Get page type specified by an explicit namespace argument. local function getNamespaceArgPageType(title, args) local namespaceArg = getNamespaceArg(title, args) if namespaceArg == true then -- Namespace has been explicitly enabled, so return the default for -- this namespace return getExplicitPageType(title) elseif namespaceArg == false then -- Namespace has been explicitly disabled return getDefaultPageType(args) elseif namespaceArg then -- This namespaces uses custom text return namespaceArg else return nil end end -- Get page type not specified or detected by other means local function getOtherPageType(title, args) -- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes. local isInDefaultActiveNamespace = false local defaultNamespacesKey = args[cfg.defaultns] if defaultNamespacesKey == cfg.defaultnsAll then isInDefaultActiveNamespace = true else local defaultNamespaces if defaultNamespacesKey == cfg.defaultnsExtended then defaultNamespaces = cfg.extendedNamespaces elseif defaultNamespacesKey == cfg.defaultnsNone then defaultNamespaces = {} else defaultNamespaces = cfg.defaultNamespaces end isInDefaultActiveNamespace = defaultNamespaces[title.namespace] end if isInDefaultActiveNamespace then return getExplicitPageType(title) else return getDefaultPageType(args) end end function p._main(args) local title if args.page then title = mw.title.new(args.page) else title = mw.title.getCurrentTitle() end if title and not yesno(args.talk, true) and args[cfg.defaultns] ~= cfg.defaultnsAll then title = title.subjectPageTitle end local pageType = detectRedirects(title, args) or nonExistent(title, args) or parseContent(title, args, { {'softredirect', cfg.softRedirect, cfg.softRedirectDefault}, -- {'setindex', cfg.sia, cfg.siaDefault, true}, {'disambiguation', cfg.dab, cfg.dabDefault, true}, -- {'rfd', cfg.rfd, cfg.rfdDefault}, }) or (title.namespace == 0 and getMainNamespaceClassPageType(title, args)) or getNamespaceArgPageType(title, args) or getOtherPageType(title, args) if yesno(args.plural, false) then pageType = pluralize(pageType) end if yesno(args.caps, false) then pageType = capitalize(pageType) end return pageType end function p.main(frame) local args = require('Module:Arguments').getArgs(frame) return p._main(args) end return p fadbfaea763964bc8d117a6fa7f890efde4cbf12 Module:Pagetype/config 828 333 434 433 2025-08-21T16:23:43Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Pagetype configuration data -- -- This page holds localisation and configuration data for Module:Pagetype. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -- This table holds the default page types for each namespace. Keys to this -- table should be integers that can be used as keys to mw.site.namespaces. cfg.pagetypes = { [0] = 'article', -- Main namespace [2] = 'user page', [4] = 'project page', [6] = 'file', [8] = 'interface page', -- MediaWiki namespace [10] = 'template', [12] = 'help page', [14] = 'category', [100] = 'portal', [118] = 'draft', [710] = 'Timed Text page', [828] = 'module', [2300] = 'gadget', [2302] = 'gadget definition', [-1] = 'special page', [-2] = 'file', -- Media namespace } -- This table holds the namespaces to be looked up from cfg.pagetypes by -- default. cfg.defaultNamespaces = { [0] = true, -- main [6] = true, -- file [10] = true, -- template [14] = true, -- category [828] = true, -- module } -- This table holds the namespaces to be looked up from cfg.pagetypes if -- cfg.defaultnsExtended is set. cfg.extendedNamespaces = { [0] = true, -- main [2] = true, -- user [4] = true, -- project [6] = true, -- file [8] = true, -- mediawiki [10] = true, -- template [12] = true, -- help [14] = true, -- category [100] = true, -- portal [118] = true, -- draft [828] = true, -- module } -- This table holds custom aliases for each namespace. cfg.customNamespaceAliases = { [0] = {'main'}, } -- The parameter name to set which default namespace values to be looked up from -- cfg.pagetypes. cfg.defaultns = 'defaultns' -- The value of cfg.defaultns to set all namespaces, including talk. cfg.defaultnsAll = 'all' -- The value of cfg.defaultns to set the namespaces listed in -- cfg.extendedNamespaces cfg.defaultnsExtended = 'extended' -- The value of cfg.defaultns to set no default namespaces. cfg.defaultnsNone = 'none' -- The parameter name to use for talk pages. cfg.talk = 'talk' -- The default value for talk pages. cfg.talkDefault = 'talk page' -- The parameter name to use for disambiguation pages page. cfg.dab = 'dab' -- The parameter name to use for non-existent pages. cfg.ne = 'nonexistent' cfg.neDefault = 'page' cfg.softRedirect = 'soft_redirect' cfg.softRedirectDefault = 'redirect' cfg.sia = 'sia' cfg.siaDefault = 'article' cfg.rfd = 'redirect' cfg.rfdDefault = 'redirect' -- This table holds the different possible aliases for disambiguation-class -- pages. These should be lower-case. cfg.dabAliases = { ['disambiguation'] = true, ['disambig'] = true, ['disamb'] = true, ['dab'] = true, } -- The default value for disambiguation pages. cfg.dabDefault = 'page' -- The parameter name to use for N/A-class page. cfg.na = 'na' -- This table holds the different possible aliases for N/A-class pages. These -- should be lower-case. cfg.naAliases = { ['na'] = true, ['n/a'] = true, } -- The default value for N/A-class pages. cfg.naDefault = 'page' -- The parameter name to use for redirects. cfg.redirect = 'redirect' -- The default value to use for redirects. cfg.redirectDefault = 'redirect' -- The parameter name for undefined namespaces. cfg.other = 'other' -- The value used if the module detects an undefined namespace. cfg.otherDefault = 'page' -- The usual suffix denoting a plural. cfg.plural = 's' -- This table holds plurals not formed by a simple suffix. cfg.irregularPlurals = { ["category"] = "categories" } -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line 33b76bd60283986954f6a6203f163f6b304b95ee Module:Error 828 334 436 435 2025-08-21T16:23:43Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -- This module implements {{error}}. local p = {} local function _error(args) local tag = mw.ustring.lower(tostring(args.tag)) -- Work out what html tag we should use. if not (tag == 'p' or tag == 'span' or tag == 'div') then tag = 'strong' end -- Generate the html. return tostring(mw.html.create(tag) :addClass('error') :wikitext(tostring(args.message or args[1] or error('no message specified', 2))) ) end function p.error(frame) local args if type(frame.args) == 'table' then -- We're being called via #invoke. The args are passed through to the module -- from the template page, so use the args that were passed into the template. args = frame.args else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame end -- if the message parameter is present but blank, change it to nil so that Lua will -- consider it false. if args.message == "" then args.message = nil end return _error(args) end return p f77bd720c216b5626efe795d3b49462d50971f7d Template:Error 10 335 438 437 2025-08-21T16:23:43Z Sharparam 284703 1 revision imported: Imported from Wikipedia wikitext text/x-wiki {{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude> {{documentation}} </noinclude> 5da54c14258c1b1755a03bccb88dc5d9d0cefb56 Module:Format link 828 336 440 439 2025-08-21T16:23:43Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the {{format link}} template. -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local mError -- lazily initialise [[Module:Error]] local yesno -- lazily initialise [[Module:Yesno]] local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end local function maybeItalicize(s, shouldItalicize) -- Italicize s if s is a string and the shouldItalicize parameter is true. if s and shouldItalicize then return '<i>' .. s .. '</i>' else return s end end local function parseLink(link) -- Parse a link and return a table with the link's components. -- These components are: -- - link: the link, stripped of any initial colon (always present) -- - page: the page name (always present) -- - section: the page name (may be nil) -- - display: the display text, if manually entered after a pipe (may be nil) link = removeInitialColon(link) -- Find whether a faux display value has been added with the {{!}} magic -- word. local prePipe, display = link:match('^(.-)|(.*)$') link = prePipe or link -- Find the page, if it exists. -- For links like [[#Bar]], the page will be nil. local preHash, postHash = link:match('^(.-)#(.*)$') local page if not preHash then -- We have a link like [[Foo]]. page = link elseif preHash ~= '' then -- We have a link like [[Foo#Bar]]. page = preHash end -- Find the section, if it exists. local section if postHash and postHash ~= '' then section = postHash end return { link = link, page = page, section = section, display = display, } end local function formatDisplay(parsed, options) -- Formats a display string based on a parsed link table (matching the -- output of parseLink) and an options table (matching the input options for -- _formatLink). local page = maybeItalicize(parsed.page, options.italicizePage) local section = maybeItalicize(parsed.section, options.italicizeSection) if (not section) then return page elseif (not page) then return mw.ustring.format('§&nbsp;%s', section) else return mw.ustring.format('%s §&nbsp;%s', page, section) end end local function missingArgError(target) mError = require('Module:Error') return mError.error{message = 'Error: no link or target specified! ([[' .. target .. '#Errors|help]])' } end -------------------------------------------------------------------------------- -- Main functions -------------------------------------------------------------------------------- function p.formatLink(frame) -- The formatLink export function, for use in templates. yesno = require('Module:Yesno') local args = getArgs(frame) local link = args[1] or args.link local target = args[3] or args.target if not (link or target) then return missingArgError('Template:Format link') end return p._formatLink{ link = link, display = args[2] or args.display, target = target, italicizePage = yesno(args.italicizepage), italicizeSection = yesno(args.italicizesection), categorizeMissing = args.categorizemissing } end function p._formatLink(options) -- The formatLink export function, for use in modules. checkType('_formatLink', 1, options, 'table') local function check(key, expectedType) --for brevity checkTypeForNamedArg( '_formatLink', key, options[key], expectedType or 'string', true ) end check('link') check('display') check('target') check('italicizePage', 'boolean') check('italicizeSection', 'boolean') check('categorizeMissing') -- Normalize link and target and check that at least one is present if options.link == '' then options.link = nil end if options.target == '' then options.target = nil end if not (options.link or options.target) then return missingArgError('Module:Format link') end local parsed = parseLink(options.link) local display = options.display or parsed.display local catMissing = options.categorizeMissing local category = '' -- Find the display text if not display then display = formatDisplay(parsed, options) end -- Handle the target option if present if options.target then local parsedTarget = parseLink(options.target) parsed.link = parsedTarget.link parsed.page = parsedTarget.page end -- Test if page exists if a diagnostic category is specified if catMissing and (mw.ustring.len(catMissing) > 0) then local title = nil if parsed.page then title = mw.title.new(parsed.page) end if title and (not title.isExternal) then local success, exists = pcall(function() return title.exists end) if success and not exists then category = mw.ustring.format('[[Category:%s]]', catMissing) end end end -- Format the result as a link if parsed.link == display then return mw.ustring.format('[[:%s]]%s', parsed.link, category) else return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category) end end -------------------------------------------------------------------------------- -- Derived convenience functions -------------------------------------------------------------------------------- function p.formatPages(options, pages) -- Formats an array of pages using formatLink and the given options table, -- and returns it as an array. Nil values are not allowed. local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink{ link = page, categorizeMissing = options.categorizeMissing, italicizePage = options.italicizePage, italicizeSection = options.italicizeSection } end return ret end return p 1253bdd2683ee4badc33856bfd5499b09a7dca1f Module:Hatnote list 828 337 442 441 2025-08-21T16:23:43Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introduced -- -- are andList & orList helpers for formatting lists with those conjunctions. -- -------------------------------------------------------------------------------- local mArguments --initialize lazily local mFormatLink = require('Module:Format link') local mHatnote = require('Module:Hatnote') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} -------------------------------------------------------------------------------- -- List stringification helper functions -- -- These functions are used for stringifying lists, usually page lists inside -- the "Y" portion of "For X, see Y" for-see items. -------------------------------------------------------------------------------- --default options table used across the list stringification functions local stringifyListDefaultOptions = { conjunction = "and", separator = ",", altSeparator = ";", space = " ", formatted = false } --Searches display text only local function searchDisp(haystack, needle) return string.find( string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle ) end -- Stringifies a list generically; probably shouldn't be used directly local function stringifyList(list, options) -- Type-checks, defaults, and a shortcut checkType("stringifyList", 1, list, "table") if #list == 0 then return nil end checkType("stringifyList", 2, options, "table", true) options = options or {} for k, v in pairs(stringifyListDefaultOptions) do if options[k] == nil then options[k] = v end end local s = options.space -- Format the list if requested if options.formatted then list = mFormatLink.formatPages( {categorizeMissing = mHatnote.missingTargetCat}, list ) end -- Set the separator; if any item contains it, use the alternate separator local separator = options.separator for k, v in pairs(list) do if searchDisp(v, separator) then separator = options.altSeparator break end end -- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§" local conjunction = s .. options.conjunction .. s if #list == 2 and searchDisp(list[1], "§") or #list > 2 then conjunction = separator .. conjunction end -- Return the formatted string return mw.text.listToText(list, separator .. s, conjunction) end --DRY function function p.conjList (conj, list, fmt) return stringifyList(list, {conjunction = conj, formatted = fmt}) end -- Stringifies lists with "and" or "or" function p.andList (...) return p.conjList("and", ...) end function p.orList (...) return p.conjList("or", ...) end -------------------------------------------------------------------------------- -- For see -- -- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the -- {{about}} and {{redirect}} templates and their variants. -------------------------------------------------------------------------------- --default options table used across the forSee family of functions local forSeeDefaultOptions = { andKeyword = 'and', title = mw.title.getCurrentTitle().text, otherText = 'other uses', forSeeForm = 'For %s, see %s.', } --Collapses duplicate punctuation at end of string, ignoring italics and links local function punctuationCollapse (text) return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text end -- Structures arguments into a table for stringification, & options function p.forSeeArgsToTable (args, from, options) -- Type-checks and defaults checkType("forSeeArgsToTable", 1, args, 'table') checkType("forSeeArgsToTable", 2, from, 'number', true) from = from or 1 checkType("forSeeArgsToTable", 3, options, 'table', true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- maxArg's gotten manually because getArgs() and table.maxn aren't friends local maxArg = 0 for k, v in pairs(args) do if type(k) == 'number' and k > maxArg then maxArg = k end end -- Structure the data out from the parameter list: -- * forTable is the wrapper table, with forRow rows -- * Rows are tables of a "use" string & a "pages" table of pagename strings -- * Blanks are left empty for defaulting elsewhere, but can terminate list local forTable = {} local i = from local terminated = false -- If there is extra text, and no arguments are given, give nil value -- to not produce default of "For other uses, see foo (disambiguation)" if options.extratext and i > maxArg then return nil end -- Loop to generate rows repeat -- New empty row local forRow = {} -- On blank use, assume list's ended & break at end of this loop forRow.use = args[i] if not args[i] then terminated = true end -- New empty list of pages forRow.pages = {} -- Insert first pages item if present table.insert(forRow.pages, args[i + 1]) -- If the param after next is "and", do inner loop to collect params -- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3} while args[i + 2] == options.andKeyword do if args[i + 3] then table.insert(forRow.pages, args[i + 3]) end -- Increment to next "and" i = i + 2 end -- Increment to next use i = i + 2 -- Append the row table.insert(forTable, forRow) until terminated or i > maxArg return forTable end -- Stringifies a table as formatted by forSeeArgsToTable function p.forSeeTableToString (forSeeTable, options) -- Type-checks and defaults checkType("forSeeTableToString", 1, forSeeTable, "table", true) checkType("forSeeTableToString", 2, options, "table", true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- Stringify each for-see item into a list local strList = {} if forSeeTable then for k, v in pairs(forSeeTable) do local useStr = v.use or options.otherText local pagesStr = p.andList(v.pages, true) or mFormatLink._formatLink{ categorizeMissing = mHatnote.missingTargetCat, link = mHatnote.disambiguate(options.title) } local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr) forSeeStr = punctuationCollapse(forSeeStr) table.insert(strList, forSeeStr) end end if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end -- Return the concatenated list return table.concat(strList, ' ') end -- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps -- but not blank/whitespace values. Ignores named args and args < "from". function p._forSee (args, from, options) local forSeeTable = p.forSeeArgsToTable(args, from, options) return p.forSeeTableToString(forSeeTable, options) end -- As _forSee, but uses the frame. function p.forSee (frame, from, options) mArguments = require('Module:Arguments') return p._forSee(mArguments.getArgs(frame), from, options) end return p 1c8e6212115f76ecc3db8d05137011cd18207988 Module:Hatnote 828 338 444 443 2025-08-21T16:25:56Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules. -- -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local yesno -- lazily initialise [[Module:Yesno]] local formatLink -- lazily initialise [[Module:Format link]] ._formatLink local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end function p.defaultClasses(inline) -- Provides the default hatnote classes as a space-separated string; useful -- for hatnote-manipulation modules like [[Module:Hatnote group]]. return (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' .. 'navigation-not-searchable' end function p.disambiguate(page, disambiguator) -- Formats a page title with a disambiguation parenthetical, -- i.e. "Example" → "Example (disambiguation)". checkType('disambiguate', 1, page, 'string') checkType('disambiguate', 2, disambiguator, 'string', true) disambiguator = disambiguator or 'disambiguation' return mw.ustring.format('%s (%s)', page, disambiguator) end function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to false. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end function p.makeWikitextError(msg, helpLink, addTrackingCategory, title) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- [[Module:Yesno]], and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') title = title or mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' ([[' .. helpLink .. '|help]])' else helpText = '' end -- Make the category text. local category if not title.isTalkPage -- Don't categorise talk pages and title.namespace ~= 2 -- Don't categorise userspace and yesno(addTrackingCategory) ~= false -- Allow opting out then category = 'Hatnote templates with errors' category = mw.ustring.format( '[[%s:%s]]', mw.site.namespaces[14].name, category ) else category = '' end return mw.ustring.format( '<strong class="error">Error: %s%s.</strong>%s', msg, helpText, category ) end local curNs = mw.title.getCurrentTitle().namespace p.missingTargetCat = --Default missing target category, exported for use in related modules ((curNs == 0) or (curNs == 14)) and 'Articles with hatnote templates targeting a nonexistent page' or nil function p.quote(title) --Wraps titles in quotation marks. If the title starts/ends with a quotation --mark, kerns that side as with {{-'}} local quotationMarks = { ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true } local quoteLeft, quoteRight = -- Test if start/end are quotation marks quotationMarks[string.sub(title, 1, 1)], quotationMarks[string.sub(title, -1, -1)] if quoteLeft or quoteRight then title = mw.html.create("span"):wikitext(title) end if quoteLeft then title:css("padding-left", "0.15em") end if quoteRight then title:css("padding-right", "0.15em") end return '"' .. tostring(title) .. '"' end -------------------------------------------------------------------------------- -- Hatnote -- -- Produces standard hatnote text. Implements the {{hatnote}} template. -------------------------------------------------------------------------------- p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end function p.hatnote(frame) local args = getArgs(frame) local s = args[1] if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end return p._hatnote(s, { extraclasses = args.extraclasses, selfref = args.selfref }) end function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) options = options or {} local inline = options.inline local hatnote = mw.html.create(inline == 1 and 'span' or 'div') local extraclasses if type(options.extraclasses) == 'string' then extraclasses = options.extraclasses end hatnote :attr('role', 'note') :addClass(p.defaultClasses(inline)) :addClass(extraclasses) :addClass(options.selfref and 'selfref' or nil) :wikitext(s) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' } } .. tostring(hatnote) end return p e4b658e3483374de2bebf772f3d19aaa713ca3f5 Module:About 828 339 446 445 2025-08-21T16:25:56Z Sharparam 284703 1 revision imported: Imported from Wikipedia Scribunto text/plain local mArguments --initialize lazily local mHatnote = require('Module:Hatnote') local mHatList = require('Module:Hatnote list') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.about (frame) -- A passthrough that gets args from the frame and all mArguments = require('Module:Arguments') args = mArguments.getArgs(frame) return p._about(args) end function p._about (args, options) -- Produces "about" hatnote. -- Type checks and defaults checkType('_about', 1, args, 'table', true) args = args or {} checkType('_about', 2, options, 'table', true) options = options or {} local defaultOptions = { aboutForm = 'This %s is about %s. ', PageType = require('Module:Pagetype').main(), otherText = nil, --included for complete list sectionString = 'section' } for k, v in pairs(defaultOptions) do if options[k] == nil then options[k] = v end end -- Set initial "about" string local pageType = (args.section and options.sectionString) or options.PageType local about = '' if args[1] then about = string.format(options.aboutForm, pageType, args[1]) end --Allow passing through certain options local fsOptions = { otherText = options.otherText, extratext = args.text } local hnOptions = { selfref = args.selfref } -- Set for-see list local forSee = mHatList._forSee(args, 2, fsOptions) -- Concatenate and return return mHatnote._hatnote(about .. forSee, hnOptions) end return p 1abb25315b25b63b97d98ecae17733cbea8fcc6a Module:Pagetype/softredirect 828 340 450 2025-08-21T16:31:25Z Sharparam 284703 Created page with "-- This page contains a table of all soft redirect templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["R from category navigation"] = true, -- ["Redirect from category navigation"] = true, -- ["Category redirect"] = true, -- ["Cat move"] = true, -- ["Cat red"] = true, -- ["Cat redir"] = true, -- ["Cat redirect"] =..." Scribunto text/plain -- This page contains a table of all soft redirect templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["R from category navigation"] = true, -- ["Redirect from category navigation"] = true, -- ["Category redirect"] = true, -- ["Cat move"] = true, -- ["Cat red"] = true, -- ["Cat redir"] = true, -- ["Cat redirect"] = true, -- ["Category move"] = true, -- ["Category Redirect"] = true, -- ["Categoryredirect"] = true, -- ["Catr"] = true, -- ["Catred"] = true, -- ["Catredir"] = true, -- ["Catredirect"] = true, -- ["R from template-generated category"] = true, -- ["Redirect from template-generated category"] = true, -- ["Soft redirect"] = true, -- ["Interwiki redirect"] = true, -- ["Plain soft redirect"] = true, -- ["Soft"] = true, -- ["Soft link"] = true, -- ["Soft redir"] = true, -- ["Soft Redirect"] = true, -- ["Softr"] = true, -- ["Softredir"] = true, -- ["SoftRedirect"] = true, -- ["Softredirect"] = true, -- ["Userrename"] = true, -- ["Wikimedia Commons redirect"] = true, -- ["COMM"] = true, -- ["Comm"] = true, -- ["Commons Redirect"] = true, -- ["Commons redirect"] = true, -- ["CommonsRedirect"] = true, -- ["Commonsredirect"] = true, -- ["Wikimedia commons redirect"] = true, } 113c40f4040b1bf259fc2008e16d434acffa11fd 453 450 2025-08-21T16:35:00Z Sharparam 284703 Sharparam renamed page [[Module:PageType/softredirect]] to [[Module:Pagetype/softredirect]] without leaving a redirect: Misspelled title Scribunto text/plain -- This page contains a table of all soft redirect templates and their -- redirects. Templates names are capitalized, and the Template: prefix is -- removed. Templates are grouped with the main template first, followed by -- its redirects. return { -- ["R from category navigation"] = true, -- ["Redirect from category navigation"] = true, -- ["Category redirect"] = true, -- ["Cat move"] = true, -- ["Cat red"] = true, -- ["Cat redir"] = true, -- ["Cat redirect"] = true, -- ["Category move"] = true, -- ["Category Redirect"] = true, -- ["Categoryredirect"] = true, -- ["Catr"] = true, -- ["Catred"] = true, -- ["Catredir"] = true, -- ["Catredirect"] = true, -- ["R from template-generated category"] = true, -- ["Redirect from template-generated category"] = true, -- ["Soft redirect"] = true, -- ["Interwiki redirect"] = true, -- ["Plain soft redirect"] = true, -- ["Soft"] = true, -- ["Soft link"] = true, -- ["Soft redir"] = true, -- ["Soft Redirect"] = true, -- ["Softr"] = true, -- ["Softredir"] = true, -- ["SoftRedirect"] = true, -- ["Softredirect"] = true, -- ["Userrename"] = true, -- ["Wikimedia Commons redirect"] = true, -- ["COMM"] = true, -- ["Comm"] = true, -- ["Commons Redirect"] = true, -- ["Commons redirect"] = true, -- ["CommonsRedirect"] = true, -- ["Commonsredirect"] = true, -- ["Wikimedia commons redirect"] = true, } 113c40f4040b1bf259fc2008e16d434acffa11fd Module:Pagetype/disambiguation 828 341 452 2025-08-21T16:34:01Z Sharparam 284703 Created page with "return require [[Module:Disambiguation/templates]]" Scribunto text/plain return require [[Module:Disambiguation/templates]] 9b7267108d8d085f28ae9bed61725ad9e43240c7 Coordinates 0 342 454 2025-08-21T16:47:58Z Sharparam 284703 Created page with "{{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}} '''{{PAGENAME}}''' are used to indicate the player's location in the world. == Overview == The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height). == Bugs == * The coordinates as displayed inside the game on the inventory screen are often incorrect. The game t..." wikitext text/x-wiki {{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}} '''{{PAGENAME}}''' are used to indicate the player's location in the world. == Overview == The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height). == Bugs == * The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate {{val|13529}} (five digits), the game will show it as {{val|1352}} (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command. == External links == * [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation [[Category:Game mechanics]] 4b2a35e53034534a2fd7a260f1c18bf681e114ed 455 454 2025-08-21T17:06:44Z Sharparam 284703 Fix numbers temporarily(?) wikitext text/x-wiki {{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}} '''{{PAGENAME}}''' are used to indicate the player's location in the world. == Overview == The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height). == Bugs == * The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate <!--{{val|13529}}-->13&thinsp;529 (five digits), the game will show it as <!--{{val|1352}}-->1&thinsp;352 (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command. == External links == * [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation [[Category:Game mechanics]] aae05c5dc19ae85bd040d250b6a65c2a649d6e81 Template:Infobox/NPC 10 343 456 2025-08-21T17:21:46Z Sharparam 284703 Created page with "<includeonly>{{#invoke:Infobox|main | kind = npc | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} }}{{#if:{{NAMESPACE}}||[[Category:NPCs]]}}</includeonly><noinclude> {{Documentation}} </noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind = npc | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} }}{{#if:{{NAMESPACE}}||[[Category:NPCs]]}}</includeonly><noinclude> {{Documentation}} </noinclude> 02c1a8c11cfad8392626d8b5b51c89305185a1e9 Template:Infobox/NPC/doc 10 344 457 2025-08-21T17:24:18Z Sharparam 284703 Created page with "== Example == {{Infobox/NPC | title = The Handler | image = The Handler.png }} <syntaxhighlight lang="wikitext"> {{Infobox/NPC | title = The Handler | image = The Handler.png }} </syntaxhighlight> <includeonly>{{Sandbox other|| [[Category:Infobox templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == Example == {{Infobox/NPC | title = The Handler | image = The Handler.png }} <syntaxhighlight lang="wikitext"> {{Infobox/NPC | title = The Handler | image = The Handler.png }} </syntaxhighlight> <includeonly>{{Sandbox other|| [[Category:Infobox templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> d6d4e015f0c8254a14cabf15ee3f9625d87804ac The Handler 0 345 458 2025-08-21T17:26:20Z Sharparam 284703 Created page with "{{Infobox/NPC | image = The Handler Blok 6147.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]]. == Overview == Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective. She will usually appear next to the [[Homunculus]] closest to the entrance of an area. The Handler's synchronizati..." wikitext text/x-wiki {{Infobox/NPC | image = The Handler Blok 6147.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]]. == Overview == Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective. She will usually appear next to the [[Homunculus]] closest to the entrance of an area. The Handler's synchronization level can be increased by finding [[Handler Echo|handler echoes]] and bringing them to her. Increasing her level allows for upgrading [[equipment]] to higher levels. == Appearance == She appears to be some sort of robot or cyborg, with light skin, black parts, and silver hair. == Locations == {| class="wikitable" ! scope="col" | Area ! scope="col" | Description ! scope="col" | Coordinates |- | [[Monastery]] || Near the first [[Homunculus]] (only in [[New Game Plus]]) || {{coords|23473.78|-85243.22|-15260.61}} |- | [[Blok 6147]] || In the center (right next to the [[Homunculus]]) || {{coords|-25.27|442.48|1160.96}} |- | [[Deluge]] || Sitting on a ledge near the first [[Homunculus]] || {{coords|-3307|-7449|5650}} |- | [[Asylum]] || Standing in front of a pillar near the [[Homunculus]] || {{coords|-4507|6967|9032}} |- | [[Upper Blocks]] || Standing in front of some rubble opposite of the [[Homunculus]] || {{coords|4585|1626|2193}} |- | [[Machinarium]] || Standing next to a wall just past the first [[Homunculus]] || {{coords|-2125.53|27029.25|-12156.72}} |- | [[Desert]] || Standing next to a wall just past the [[Homunculus]] || {{coords|-9576.35|65589.26|-136382.62}} |- | [[Anomaly]] || Standing next to a pair of pillars just past the [[Homunculus]] || {{coords|46782.80|162169.12|-141987.55}} |- | [[Vermillion Fields]] || Standing next to the [[Homunculus]], mirroring her location in [[Blok 6147]] || {{coords|582|-4995|1178}} |} == Quotes == === When approached === When approached without any special event dialogue waiting to be triggered, she will pick one of the below greeting phrases at random. {{Quote|Hello!|audio=The_Handler_Hello.ogg}} {{Quote|Hello there!|audio=The_Handler_Hello_There.ogg}} {{Quote|Well hello there!|audio=The_Handler_Well_Hello_There.ogg}} {{Quote|Back so soon!|audio=The_Handler_Back_So_Soon.ogg}} {{Quote|Look who came to visit!|audio=The_Handler_Look_Who_Came_To_Visit.ogg}} === First encounter === {{Quote |You're finally here. We can now commence the [[recalibration]]. I've updated the locations of the malfunctioning modules in the terminal. Any time you link to a terminal, you should be able to see the modules. I must advise utmost caution, as I have surveyed the area and it is infested with aggressive mutations. The radiation leaking out of [[The Anomaly|the anomaly]] is causing a strong disturbance in the casual field. We should leave this place as soon as possible. The readings are unlike anything I've seen. The data is completely unstable as I am still unable to upload it for decyphering. Farewell. | audio = The_Handler_First_Encounter.ogg }} === After first [[recalibration]] === {{Quote |There is one module left to recalibrate. Unfortunately the data leaking from [[The Anomaly|the anomaly]] is still too corrupted to read. The surveillance net has taken note of ripples with particularly long wavelengths unusually coming into existence. I believe it's a sign of intruders – particularly dangerous ones that are not of our timeline. I am not sure I understand what exactly is going on here. I suppose we are yet to learn the true definition of something anomalous. Farewell. }} === After second [[recalibration]] === {{Quote |The [[recalibration]] was successful, the transgression field is down. [[The Anomaly|The anomaly]] is now exposed and ready to be stabilized. ''*silence*'' I'm afraid I will be breaching protocol by telling you, that since the recalibration – I have been unable to transmit or receive any transmissions from any other floor. If I had to make a guess, I would say something from inside the anomaly is tampering with much more than just the causal field. I am afraid I am not equipped to run a robust field analysis, but I speculate we're dealing with an event far outside our scope. Nevertheless, I did run some more rudimentary data decrypting processes. The leaks from inside the anomaly are not arbitrary, they reveal the patterns of language. I have tried to compute at least the general scope and nature of its form – but the permutations are overwhelming all of my systems. Simply running the processes has had some kind of spillover effect into the computing instruments themselves. This language is of unfathomable complexity. Take great caution, these are circumstances far outside the realms of understanding. Farewell. }} === First encounter in [[Vermillion Fields]] === {{Quote |Good to see a familiar face. I must admit, I am no more aware of what is really taking place than I was before this turn of events. I believe there is a powerful external force moving the needle here, and we are completely oblivious to its nature. I am afraid I won't be of much more use to you in this state, and I'm not quite sure how I've even made it this far. However, I will help with what I can, while I'm here. I did however learn something. While being transported I noticed a certain Vermillion branching structure buffering this entire world and its roots run deeply. My access was promptly restricted, leaving me in this condition. Whatever effect the Vermillion structure has, we must be very careful. I believe it has access to base reality, in which case we are dealing with a potential cataclysmic event. I don't know if it is fear, or excitement – whatever we are experiencing here makes me feel in a way I find hard to describe. Stay safe. }} Her lines in [[Vermillion Fields]] are delivered in a distorted voice, she will also no longer greet the player when approached. Despite her claims about not being of much use any more, she can still perform all of her normal functions. == Gallery == <gallery> File:The_Handler_Blok_6147.png|[[The Handler]] in [[Blok 6147]].|alt=Screenshot showing The Handler standing around in Blok 6147. File:The_Handler_Deluge.png|[[The Handler]] in [[Deluge]].|alt=Screenshot showing The Handler sitting on a ledge in Deluge. File:The_Handler_Asylum.png|[[The Handler]] in [[Asylum]].|alt=Screenshot showing The Handler standing around in Asylum. File:The_Handler_Upper_Blocks.png|[[The Handler]] in [[Upper Blocks]].|alt=Screenshot showing The Handler standing around in Upper Blocks. File:The_Handler_Machinarium.png|[[The Handler]] in [[Machinarium]].|alt=Screenshot showing The Handler standing around in Machinarium. </gallery> == Trivia == * The game files call her "Blacksmith". {{Navbox/NPCs}} 02c4e3851b0e4e388eeab0d2e668595e202d0df7 Template:BFF 10 346 459 2025-08-21T17:27:27Z Sharparam 284703 Created page with "''[[Bleak Faith: Forsaken]]''" wikitext text/x-wiki ''[[Bleak Faith: Forsaken]]'' a07fd38648935c2ecd381aa47db3694dae3fb873 Handler 0 347 460 2025-08-21T17:27:58Z Sharparam 284703 Redirected page to [[The Handler]] wikitext text/x-wiki #REDIRECT [[The Handler]] 88b800514a0b691d707ee19ba584e637d3655f46 Category:NPCs 14 348 461 2025-08-21T17:28:32Z Sharparam 284703 Created page with "Non-player characters (NPCs) in {{BFF}}." wikitext text/x-wiki Non-player characters (NPCs) in {{BFF}}. 0dc1d8049d1a57e3aac84eafca49335d4d35f2d8 Category:Pages with inaccurate coordinates 14 349 462 2025-08-21T17:29:20Z Sharparam 284703 Created page with "Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals)." wikitext text/x-wiki Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals). 123078e1af276f585a511310432b32907710954a Category:Pages with coordinates 14 350 463 2025-08-21T17:30:55Z Sharparam 284703 Created page with "Contains pages that use the {{tl|Coordinates}} template or {{ml|Coordinates}} module." wikitext text/x-wiki Contains pages that use the {{tl|Coordinates}} template or {{ml|Coordinates}} module. 5d1e1be9b3942073a809cd311bdcb1f00bb23507 Locations 0 351 465 464 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox/Locations}} 980e15253d6e4f1418e9efa737c209de74f57252 Uranopolis 0 352 467 466 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Uranopolis''' is a location in {{BFF}}. == Sub-locations == Uranopolis consists of two sub-locations: Tower Complex and {{TODO}}. === Tower Complex === {{Main|Uranopolis/Tower Complex}} [[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]] The '''Tower Complex''' is the first sub-location encountered by the player. {{clear}} === Lone Tower === [[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]] The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here. {{Navbox/Locations}} [[Category:Locations]] fc3e22f798adfdd04bd6befa151ccc23aa80ecd5 Blok 6147 0 353 469 468 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history. }} == Trivia == * If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list. {{Navbox/Locations}} [[Category:Locations]] bda6e533357582f201b31b2a208855d0bdc73471 Monastery 0 354 471 470 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Lower == [[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]] {{Quote | A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings }} {{clear}} == Upper == [[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]] {{Quote | Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos. }} {{Navbox/Locations}} [[Category:Locations]] c45661f5fc6c65355deb9f8c90263eb72574a274 Rain District 0 355 473 472 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Sewers == [[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]] {{Quote | A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures. }} {{clear}} == Center == [[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]] {{Quote | A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour }} {{Navbox/Locations}} [[Category:Locations]] 411486cc02e286f1982f8922cb1e84ebe86d13e4 Deluge 0 356 475 474 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} {{Navbox/Locations}} [[Category:Locations]] 693a79d49e7efc3474fef04a49a6ecfcf873ac1f Asylum 0 357 477 476 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} {{Navbox/Locations}} [[Category:Locations]] 37e0b512f0b81e8f301b3b2858e9d4da7562c26f Upper Blocks 0 358 479 478 2025-08-21T17:34:28Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation. }} {{Navbox/Locations}} [[Category:Locations]] 8eb05dbbf1b2eca301ec7824369953ecf59627e8 Ghost Town 0 359 481 480 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}} == Floor 1 == [[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]] {{Quote | A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog. }} {{Navbox/Locations}} [[Category:Locations]] de022882ea75493bf878521b5de2b72ab78ee421 Machinarium 0 360 483 482 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay. }} {{Navbox/Locations}} [[Category:Locations]] bdce97e055f63d9b564bb8af98884bb9353ec5db Desert 0 361 485 484 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum. }} {{Navbox/Locations}} [[Category:Locations]] 7a4e1dcb94c588a7cbdfa9c4abb1a9303a8d2d79 Desert Mirage 0 362 487 486 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A desert from another time. }} {{Navbox/Locations}} [[Category:Locations]] b77e5799a2dcb88ca21171824a322e70e1ceed2f Anomaly (location) 0 363 489 488 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} {{Navbox/Locations}} [[Category:Locations]] a8fc6f2bc209173c6c2c5d3d178232dfb1ed8321 Vermillion Fields 0 364 491 490 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Overview == Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]]. == Plaza == [[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]] {{Quote |Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field. }} {{clear}} == Temple == [[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]] {{Quote |Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes. }} {{Navbox/Locations}} [[Category:Locations]] 71f1f17927909020242b8cf472a7e2f89199d643 Unknown (location) 0 365 493 492 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}} '''Unknown''' is a [[Locations|location]] in {{BFF}}. == Overview == As the Unknown cannot be relocated to, it has no artwork image and no in-game description. {{Navbox/Locations}} [[Category:Locations]] 351676f2dfc783d43a014b11a690031ea946e2b8 Unknown 0 366 495 494 2025-08-21T17:34:29Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Unknown''' may refer to: == Common meanings == * [[Unknown (location)]], the location with the platforming puzzles leading to an optional boss. * [[Unknown (boss)]], the boss enemy that can be optionally fought in the location sharing its name. {{Disambiguation}} a972049d778c73207104b07ad235871c7a53466d NPC 0 367 497 496 2025-08-21T17:35:52Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[NPCs]] 0c78678b45694b9a9f67883eca2a30eaa6ea5607 NPCs 0 368 499 498 2025-08-21T17:35:52Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Non-player characters (NPC)''' are characters in {{BFF}} that can aid the player, provide services, or be spoken to in order to learn more about the world. == Notable NPCs == * [[The Handler]] &ndash; Upgrades [[equipment]] and allows for [[crafting]] certain [[items]]. {{Navbox/NPCs}} 79553771fc8e6ca775b99979d35e2de32ae39cbb Untitled Log 0 369 501 500 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[lore]] [[Documents|document]] that can be found in {{BFF}}. == Overview == There are multiple untitled logs in the game, each with their own text. {{Quote |I remember waking in a pile of lifeless bodies. Not only lifeless though. Expressionless. Frozen visages. }} {{Quote | Like waking from a dream about dreaming, everything is a haze. A dark ominous haze. I've seen death, pain, and torture. I hear a voice. Once in a while I see the voice beckon, like a ripple in water &ndash; before I can make form of the image. I am gone too. }} {{Quote | I have no mouth, and I know nobody would hear me scream.{{note|Likely a reference to [[wikipedia:I Have No Mouth, and I Must Scream|I Have No Mouth, and I Must Scream]].}} }} {{Quote | No matter where my mind wanders, there is an oppressive red mist crushing the reaches of my imagination. Try as I might, there seems to be no escape. No escape. Only a journey deeper. Farther.. but what awaits at the innermost depths. I suppose the [[Omnistructure]] makes room beyond sense.. beyond time. }} == Notes == {{notelist}} {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 472bf3de6dbca52f57c3f288b12ad3650a51f3b6 Monastery Impression 0 370 503 502 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote | Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence &ndash; here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 5d6199c92d0ebf1baedb5890d3776274eadefaef Lore 0 371 505 504 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' can be found as text on [[items]], various [[data logs]] and [[documents]], and [[NPC]] dialogue in {{BFF}}. == Data logs == {{Main|Data logs}} == Documents == {{Main|Documents}} {{Navbox/Lore}} [[Category:Lore]] 3efab73936854b174032435bb0c6f8b77736139d Data logs 0 372 507 506 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Data logs are uncovered by interacting at certain specific points in the game world. To locate these points, use of the [[Scanner]] is recommended. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 0b268f9f4958f98eba1f00ec6c06edbba3c10826 Documents 0 373 509 508 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[items]] that can be found in the world of {{BFF}}. == Overview == Documents are typically found as drops from [[enemies]]. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 3305c6ccf580021e8513f612ab7919e6863f1f47 Scanner 0 374 511 510 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | image = Scanner.png | title = {{PAGENAME}} | Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena. }} The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders. {{Navbox/Items}} [[Category:Essential items]] [[Category:Lore]] 72e26e842e217333080947ca9fd96dff00b2be1e Dust Sea 0 375 513 512 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki The '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | At the base of the sprawling mining facility, a deep mist blankets the ground, leading out to a vast, desolate desert. This desert's sand is a choking mix of dust and residue from the countless constructions and creations towering above. The air is perilous to breathe, laden with fine particles that can invade the lungs. Scattered across this wasteland are the carcasses of long-forgotten machinery and the ruins of old structures. The architecture of these relics hints at a bygone era, a dark age marked by more primitive technology. This eerie landscape tells a silent tale of a past civilization, now buried beneath the relentless sands of time. }} == Location == {{coords|-4062|-2272|5797}} Can be found at the top of a broken down tower in [[Deluge|the Deluge]] area, just past the [[Folk Cape]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left. Continue forward until reaching the big tower, climb it to the top and you will find the data log at the edge of the tower (use [[Scanner|the Scanner]] to see it more easily). {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 90fdcaf4874fbb945c79bf4bf3df130f8ba25db5 Psychosis 0 376 515 514 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |I've repeated the Completeness Protocol over 40 times now to no avail. No training can prepare a mind for this. All sense and reason are gone. The mental fortitude required to hold a coherent thought for longer than a heartbeat is soul-crushing. It feels like I am existing from one moment to the next. Picking up the remnants of déjà vu after déjà vu… }} == Location == {{coords|-5130|-1039|5616}} Found in [[Deluge|the Deluge]] area, near one of the [[Upgrade Splinter|upgrade splinters]] in the first big rectangular structure with pillars, near the first red lightpole. Use [[Scanner|the Scanner]] to more easily find the data log. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] b4998452a6a35bf04aeb60ea5d8c95c3edf9e497 Night Horror 0 377 517 516 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote |In the tower of [[Asylum|the asylum]], a chilling and unearthly wail reverbates through the walls—a sound that can only be described as the cry of a banshee. The eerie, mournful shrieks cut through the silence, hinting at a presence both agonizing and spectral. Among the abominations and horrors that define this place, one patient remains, but it's difficult to truly say they have survived. This lone individual, if they can still be called such, exists in a state that blurs the line between life and death, their being a twisted echo of humanity amidst the torment. The banshee's cries seem to emanate from this tormented soul, a haunting reminder of the asylum's dark legacy and the incomprehensible suffering endured within its dark halls. }} == Location == {{coords|-3811|1199|9172}} Found in [[Asylum|the Asylum]]. Located below a staircase after leaving the first building. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] fc7ee13e9ef0e02cd4a7722f0e91cb2e83028519 The Banshee 0 378 519 518 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] that can be found in {{BFF}}. == Overview == {{Quote | The banshee's movements, dancing through [[Asylum|the asylum's]] decaying tower, are unsettingly precise, as if they were once part of a carefully honed combat style. Each anguished gesture and frenzied motion mirrors advanced fighting techniques, reminiscent of those taught at the highest levels of military training. The eerie choreography suggests that the creature's wails are not merely cries of torment, but the remnants of a brutal experiment aimed at forging a living weapon. The movements, though now distorted and ghostly, hint at a once-formed discipline, twisted into a nightmarish mockery of the intended martial prowess. This spectral entity seems to embody the cruel ambition of those who sought to create a perfect instrument of war through unthinkable means. }} == Location == {{coords|-3943|1596|1532}} Found in the center of a circular room, surrounded by chairs, in the big tower in [[Asylum|the asylum]]. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 0309dfabb2c1cb6950f037a68ebce98a2b67b20f Hellicar's Maxims 0 379 521 520 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}. == Acquisition == Drops from [[enemies]] in the game. * Asylum enemy with cape and sword+shield. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] 9e54fe19f15f8d8dce8dd560ec5bc7a0f7a98dab Shadows in the Courtyard 0 380 523 522 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | There's a radial pattern in [[Blok 6147|this Blok]]. A heavily pedestrian zone. The people living here must have had a rather communal spirit. I can't tell if it's just my mind, but I can hear the echoes of children shouting. The ring of a school bell. The creek of a rusty gate opening and closing in a morning ritual. I imagine some of the views here are rather stunning. }} == Location == {{coords|-1016|-3857|2319}} Found in [[Blok 6147]], on a round balcony overlooking the central hub. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 3ea9546e3cf140db20981b41b9f9f6e2f674c210 Inhabitants 0 381 525 524 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{stub}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 1fac3c562d846adb7b3b2e5ab3eb4d386c14b532 Serpentine Visions 0 382 527 526 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Among the towering spires of the city, there are whispers of a colossal sky serpent that drifts silently through the steel and concrete canyons. Though the serpent is said to be harmless, its sheer size and graceful, serpentine movements evoke both awe and trepidation. With scales that shimmer in hues matching the city's metallic sheen, the serpent weaves effortlessly through the narrow gaps between the tower, its long, undulating body casting an imposing shadow over the pristine surfaces below. its presence, though non-threatening, is a constant reminder of the vastness and wildness that still lingers even in this meticulously engineered urban landscape. The serpent's slow, deliberate light adds a touch of majesty and enigma to the stark cityscape, making its silent passage through the towering structures a mesmerizing spectacle that commands both reverence and respect. }} == Location == {{coords|9922|-6769|1440}} Found in [[Uranopolis]] on a ledge on one of the platforms reached by navigating the bridges. Use [[Scanner|the scanner]] to find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] e002a14503e5a3d60e77f6a2a8484fc1381a05d3 Shifting Sands 0 383 529 528 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |There are unsettling rumors about a colossal worm with wings made of bones, said to inhabit a hidden realm. This serpentine creature is described as having a face that resembles a person frozen in a dream, an eerie visage that defies understanding. The worm is said to speak and whisper to anyone who dares enter its domain—or even to those who merely think about it. Its nature alludes to something of maker origin. Something capable of changing the structure. }} == Location == {{coords|-9400|7378|-1350}} Found in [[Desert|the Desert]], near the big enemy with red eyes after crossing the bridge past the [[Homunculus]]. It is in front of a set of doors. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] b48a873694f25c03f22938908578b61c6b9c4912 Call of the Void 0 384 531 530 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The giant staircase looms before me, its sheer expanse a vertiginous marvel that seems to stretch endlessly downward into the void. Each step is a monstrous slab of cold, unfeeling metal, worn smooth by countless unknown feet. As I descend, the sense of vertigo intensifies, and the emptiness below grows ever more profound. The abyss at the base of the staircase seems to call out with an irresistible allure, a dark, seductive whisper that tugs at the edges of my mind. The staircase feels alive with this haunting invitation, a siren song of emptiness that beckons irresistibly into the darkness below. }} == Location == {{coords|1132|-8482|1965}} Found in [[Ghost Town#Floor 13|Ghost Town (Floor 13)]]. Starting from the [[Homunculus]], head down the stairs. Head up the stairs behind the crying enemy at the bottom and the data log will be at the end of the walkway. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 6926f68eafdb547e25880491f97dcb505ad73b95 Umbral City 0 385 533 532 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |I stumbled through the mist-shrouded sector of the city, disoriented and weary, an unsettling chill gripped me. The residential area ahead was cloaked in an eerie, ghastly haze. Every step felt heavier, as if the very air was laden with the weight of forgotten despair. I descended further into the sector, my path leading me to a graveyard that lay at the bottom, shrouded in the same pervasive mist. The gravestones, ancient and crumbling, stood like mournful sentinels in the ghostly fog. I could feel a strange, unsettling energy emanating from the ground, a spectral force that seemed to pulse through the halls around me. The sorrow and loss from the graveyard seeped into the very walls of this place, wrapping me in a shroud of grief. The haunting resonance of the graveyard's energy made every breath feel heavy, and the oppressive atmosphere left me with an unshakable sense of inescapable sorrow, as if the very essence of this forsaken place was reaching out to ensnare me. }} == Location == {{coords|1109|-9166|-1494}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], go through the doorway and take the right path, going down the stairs and following the corridors until you arrive at the subway. Go to the right and get to the end to find the data log in the corner. Use [[Scanner|the scanner]] to more easily find it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] f48b4c78d4059ac73cd01b56ac5efdc5e95bd143 Intercepted Transmission 0 386 535 534 2025-08-21T17:38:33Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |You won't get to see the fruits of your sacrifice, and only you will ever know the pain of your solitude. I'm sorry. I'll never forget you. }} == Location == {{coords|1908|-1765|-806}} In [[Blok 6147]]. After exiting the [[subway]], take that path that leads up and then walk down the stairs to find the data log in a corner. Use [[Scanner|the scanner]] to find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] f7a214fac38ad015fc367e76f78b3c313073255d Desert Dream 0 387 537 536 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |According to the readings, this gateway offers a glimpse into a reality untouched by the distortions and chaos of [[The Anomaly|the anomaly]], a place where time and space unfolded in a different manner, free from the relentless upheaval that defines this place. The sand serpent's presence must be related. }} == Location == {{coords|1471|6344|-1395}} Found in the [[Desert]]. It's located in front of the teleportation orb that leads to [[Desert Mirage]]. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] fb7777879af3c3d248160f4349e8cabe96b0e304 Heartbeat 0 388 539 538 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here. }} == Location == {{coords|3326|-6471|-6573}} Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data log]] e6a4f885a6f4e9bd91ce07da3168957b45e7a308 Silent Streets 0 389 541 540 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Interaction between the city's inhabitants is minimal and strangely formal. They pass one another with vacant, almost resigned nods, their conversations reduced to whispers that blend seamlessly with the ambient hum of the city. The air is filled with a sense of inevitability, as if their routines are an attempt to impose a semblance of order on an environment that has long forsaken any true sense of purpose or coherence. In this dreamlike, consuming city, their lives are a reflection of the city's own tragic state—a relentless cycle of existence without progress, forever trapped in the shadow of their own lost potential. }} == Location == {{coords|1244|1057|1956}} Found in [[Blok 6147]]. In an alley with a fire and nearby cargo box. It's in the area with multiple walkways at different heights with stairs between. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] d244a7077b0a0b4ba8290bdd23f999bdbf664d08 Statues 0 390 543 542 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Often found in the narrow corridors and shadowy alcoves of the city, their bodies rigidly aligned as if caught in a perpetual moment of exhaustion. Some are positioned near the vast concrete walls, their outlines faintly illuminated by the dim, ambient light, creating haunting silhouettes against the cold surface. Their eyes vacant, reflecting the dim glow of the city in a fixed, lifeless gaze. }} == Location == {{coords|1424|1365|3124}} Located in [[Blok 6147]] at the end of one of the walkways with stairs between them. [[File:Statues_location.jpg|thumb|left|Location of the data log.|alt=Screenshot showing the location of the data log.]] {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] afc40155102345cb921361ea566916b295ded7c5 Unknown Limits 0 391 545 544 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |From within, the boundary of the anomaly seems both infinite and elusive, with no clear beginning or end. It sprawls outwards in a chaotic, unpredictable manner, its influence warping space and time to create a disorienting and treacherous landscape. The sphere's growth is not linear but irregular, expanding and contracting as it incorporates elements from its surroundings, twisting them into bizarre, unrecognizable forms. }} == Location == {{coords|4984|1575|-1420}} Found in the [[Anomaly]]. When entering the area, it is the first thing you will come across as the cave opens up to the outdoors area. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 9c79704fa399a5c94c900c27d6cb8c39b760f58a The Grave Predicament 0 392 547 546 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The Administration, a dominant force within this tangled system, exhibits a deeper grasp of [[Omnistructure|the Omnistructure's]] workings compared to other entities. However, its own nature is so enigmatic that it seems to be more an emergent symptom of [[Omnistructure|the Omnistructure]] than a genuine part of it. The Administration's methods and motivations are as elusive as [[Omnistructure|the Omnistructure]] itself, blending seamlessly into the very fabric of the mysterious domain it governs within it. Its presence, while influential, only adds to the overall complexity of [[Omnistructure|the Omnistructure]], reinforcing the idea that understanding this colossal construct may forever remain an elusive, if not an impossible, pursuit. Nevertheless we must try. Our very survival hinges on our ability to adapt, and without understanding at the very least our immediate surroundings in this labyrinth, we have no room to elude the ever-pursuing peril that surrounds us. }} == Location == {{coords|4404|1793|-1412}} Located on an edge overlooking the labyrinth in the [[Anomaly]] area, just after [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius']] boss arena. Use [[Scanner|the scanner]] to more easily locate it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 4a149e96e2d9c362546ae535afb986f4d6e1cb03 Kaleidoscope of Dreams 0 393 549 548 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] represents a profound and dangerous space-time phenomenon, its expanding radius a constant threat to the stability and integrity of the entire structure. Its presence is a reminder of the fragility of order in the face of an unrelenting, chaotic force that plagues [[Omnistructure|the Omnistructure]], erasing all that it touches. }} == Location == {{coords|5310|2116|-1450}} Found in the [[Anomaly]] area, located right in front of the anomaly itself at the final part of the labyrinth. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] e9b3658c5073f52f9811e41c238dc70edd1b8e24 Vermillion 0 394 551 550 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |An omnipresent presence bathed everything in a deep vermillion{{note|"Vermillion" here refers to the color, although it might be more commonly spelled as "vermilion" (with only one L).}} hue. This color created an overwhelming sense of order. The vermillion presence exuded a serene yet unsettling stillness, embodying an ideal form of tranquility. It seemed to impose a perfect structure on the disarray around it, its calm nature hiding an underlying menace. The more you focused on the vermillion form, the more it became clear that this serenity was a guise, concealing a power that could shatter the delicate balance at play. }} == Location == {{coords|483|-4883|1752}} Found in the [[Vermillion Fields]], on top of a balcony with a [[Vermillion Knight]] guarding it. Standing at the [[Homunculus]], face the direction of [[The Handler]] and the balcony can be seen behind her. == See also == * [[Vermillion Fields]], for the endgame location * [[Vermillion Knight]], for the enemy == Notes == {{notelist}} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 989e673b86ad80578a904518b93dcddaf305e173 A Broken Reality 0 395 553 552 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |The landscape is filled with soothing, warm tones that evoke a sense of perfect calm and harmony. Yet, despite the stunning serenity, there is an unshakable feeling of not being alone, a subtle but persistent awareness that something else is present. }} == Location == {{coords|2368|-5079|1225}} Found in [[Vermillion Fields]]. Start at the [[Homunculus]] and walk to where the blue lightsaber knight is. Head outside from there and get to the edge. Take a left and follow the edge until you come to a balcony on the right with the data log. Use [[Scanner|the scanner]] to help you find it more easily. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] cb804aedc9c441989a2f08a03652278a42ce02a8 Understanding 0 396 555 554 2025-08-21T17:38:34Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote | Hierarchies within various organizations reflect a fragmented understanding of the [[Omnistructure]]. These organizations, though structured, are plagued by slow progress and sporadic breakthroughs. Their efforts to decode and rebuild within this immense and confounding realm are hindered by the overwhelming scale and shifting nature of their environment }} == Acquisition == Unlocked upon speaking to [[Inquisitor Commander Alexius]] for the first time. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 58629768126fce5c895113d20c5c3433807829d2 Category:Lore 14 397 556 2025-08-21T17:39:14Z Sharparam 284703 Created page with "Articles that deal with the [[lore]] of {{BFF}}." wikitext text/x-wiki Articles that deal with the [[lore]] of {{BFF}}. 94c2e8b39ccfcef2092a51b9d9871303a81d3550 Category:Data logs 14 398 557 2025-08-21T17:39:54Z Sharparam 284703 Created page with "[[Data logs]] in {{BFF}}." wikitext text/x-wiki [[Data logs]] in {{BFF}}. 1164d38028f62e77abae5ba8cc9ff863d3ff7188 560 557 2025-08-21T17:42:04Z Sharparam 284703 Add parent category wikitext text/x-wiki [[Data logs]] in {{BFF}}. [[Category:Lore]] 5e904cfff9956cd0b33207527c8346edd1f405f0 Category:Documents 14 399 558 2025-08-21T17:40:30Z Sharparam 284703 Created page with "[[Documents]] in {{BFF}}." wikitext text/x-wiki [[Documents]] in {{BFF}}. cc0499616b9fa18a474694b811d013e801458f57 559 558 2025-08-21T17:40:55Z Sharparam 284703 Add parent category wikitext text/x-wiki [[Documents]] in {{BFF}}. [[Category:Lore]] a47d50212d62913cf87ebea2624342bb3dd85afd Abandoned Soldier 0 400 562 561 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/NPC | image = Abandoned Soldier.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == Found in the [[Monastery#Lower|lower Monastery]], at the top of the stairs sitting next to one of the statue heads ({{coords|22476.39|-66438.91|-8856.44}}). After defeating [[Konrad the Traitor]], he moves to {{TODO|Add second location}}. At some point, he disappears entirely from the game. {{Navbox/NPCs}} e596f1f08e1e0d7bb6ddf38f363f5924a5b8dd01 Archinquisitor Belisarius 0 401 564 563 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}} {{stub}} {{Infobox/NPC | image = Archinquisitor Belisarius.png }} {{Navbox/NPCs}} 7acff4eb5df9236854d4caf127e0613b0980b80d Inquisitor Commander Alexius 0 402 566 565 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/NPC | image = Inquisitor Commander Alexius.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|-41635.32|9075.12|11831.71}} Located in the [[Asylum]], in a tower that can be reached by following a hidden path. == Quotes == === On first meeting === {{Quote |Hmmm – a visitor. A visitor to a plague at that – a rare occurence{{sic|expected=occurrence}}. Ah! The Administration? Yes – that much is now obvious. Always a pervasive need for the world to make sense – but with each passing moment, I find the [[omnistructure]] is always one step beyond it… beyond comprehension. I wonder what tales you'd share if only you could speak. Traversing every crevice and ruin on foot, my, my… the secrets you hold… and what happens to the ones you leave behind? Do you ever think of them? It sounds like a treacherous life… You must not know much kindness. And how could you – I imagine you've experienced pain and death uncountable times. It is after all reflected in your demeanour. Maybe this can make a small change. <!-- Gives greater crystals --> You know, I myself am not a stranger to challenges. This struggle between absolute power and perfect order is no longer easy to balance. I find myself giving it my all, without, seeing much in return… [[The Serdars]] now complicate things… Their sacrifices were too great for a wavering Empire. Yet rebelling against everything makes life lose its purpose… [[The Administration|The Administration's]] vision of order is sterile however… perfect, yes, but like marble – its beauty frozen permanently in the rhythm of death. In his few moments of peace, [[Yaroslav]] would probably explain it better than I – then again – his word was always as sharp as his saber. We both have work to do. Until we meet again. }} Unlocks the data log [[Understanding]] and gives you two [[Greater Anomalous Crystal|Greater Anomalous Crystals]]. === After first encounter === {{Quote|We both have work to do. Until we meet again}} {{Navbox/NPCs}} 39b57600330ffb5ca7e6c437458be303142ceb91 Yaroslav 0 403 568 567 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/NPC | image = Yaroslav.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3721|1150|-1397}} Located in the [[Desert]]. Standing with his crew in front of the gate to [[The Anomaly]]. == Quotes == === First encounter === {{Quote |Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing. Time is not of the essence here… Only choice. Soon, you'll feel it yourself. Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face… Beyond those gates, you will have to carry the greatest burden of all – your own! The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness! I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her. I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life. We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception… When you return, Collector, things will not be as they were. You will not be as you were. }} === After first encounter === {{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}} === Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] === {{Quote |Things have been set in motion that can never be explained. An eternal rain is coming our way – remember to trust your blade. You will need it more than ever. }} {{Navbox/NPCs}} 6bb0d94919bf2b14a91b7fd37736740fa5038de0 Royal Division Captain Yulia 0 404 570 569 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia.png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. {{Navbox/NPCs}} 47c5320bb535502d6ea086d13c44e3827509697f Abelard the Brave 0 405 572 571 2025-08-21T17:43:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/NPC | image = Abelard the Brave.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|3566.32|32790.88|-14128.63}} Stands on the edge of a platform at the top of the [[Machinarium]]. == Quotes == === First encounter === {{Quote |Gets lonely out here. Thank the [[God-Emperor]] for the voices that haunt me… Who knows what [[Yaroslav]] is up to. To turn on his own… so brutally. Tsss! [[Serdar]] filth! No order to this place. There's no cycle, no ebb and flow to the city. It all feels like… Eh. What do you care anyway. War is Hell. Not a sewer, so I don't exactly know what you{{note|The voice actor emphasis the "you" in this sentence, but the subtitles do not.}} are doing here. We all have our role to play. You play yours. We'll see about mine! Farewell. }} === Upon speaking to him again === {{Quote|Farewell.}} == Notes == {{notelist}} {{Navbox/NPCs}} bff64714017d7cf963314a972d069174724842aa Bleak Faith: Forsaken 0 406 573 2025-08-21T17:44:23Z Sharparam 284703 Created page with "'''''{{PAGENAME}}''''' is an action role-playing game (ARPG) game by [[Archangel Studios]]. == Soundtrack == {{Main|Bleak Faith: Forsaken Original Soundtrack}} == External links == * [http://www.bleakfaith.com/ Official website] ('''Note:''' [[wikipedia:HTTPS|HTTPS]] is not available.) * [https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/ Steam] * [https://www.gog.com/en/game/bleak_faith_forsaken GOG] * [https://www.facebook.com/bleakfaith/ Facebook] * [..." wikitext text/x-wiki '''''{{PAGENAME}}''''' is an action role-playing game (ARPG) game by [[Archangel Studios]]. == Soundtrack == {{Main|Bleak Faith: Forsaken Original Soundtrack}} == External links == * [http://www.bleakfaith.com/ Official website] ('''Note:''' [[wikipedia:HTTPS|HTTPS]] is not available.) * [https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/ Steam] * [https://www.gog.com/en/game/bleak_faith_forsaken GOG] * [https://www.facebook.com/bleakfaith/ Facebook] * [https://x.com/bleak_faith X (Twitter)] * [https://www.youtube.com/channel/UCmXqWlyuVHvoru4WBdz88Eg/about?view_as=subscriber YouTube] * [https://www.instagram.com/bleakfaithofficial/ Instagram] * [https://steamdb.info/app/1173220/ SteamDB] * [[wikidata:Q117074729|Wikidata]] 4d0375085e030286814ed6e0805f35cfbfb349cb Module:Duration 828 412 584 2025-08-21T17:55:50Z Sharparam 284703 Load styles in module Scribunto text/plain ---Duration module ---@module DurationModule ---@alias p local getArgs = require('Module:Arguments').getArgs local ARG_OPTS = { wrappers = { "Template:Duration" } } ---@class Duration ---@field h ---@field m ---@field s ---@type Duration local ZERO = { h = 0, m = 0, s = 0 } ---@type int[][] local LOOKUP = { [1] = { 0, 0, 1 }, [2] = { 0, 1, 2 }, [3] = { 1, 2, 3 } } local p = {} ---@param args any ---@return Duration local function parseDuration(args) local h = tonumber(args.h or args[1]) local m = tonumber(args.m or args[2]) local s = tonumber(args.s or args[3]) if h or m or s then return { h = h or 0, m = m or 0, s = s or 0 } --[[@as Duration]] end local input = args[1] if not input or input == "" then return ZERO end local parts = {} for part in string.gmatch(input, "%d+") do parts[#parts + 1] = tonumber(part) or 0 end local size = #parts return { h = parts[LOOKUP[size][1]] or 0, m = parts[LOOKUP[size][2]] or 0, s = parts[LOOKUP[size][3]] or 0 } --[[@as Duration]] end ---@param duration Duration ---@return string local function toisostring(duration) return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s) end ---@param duration Duration ---@return string local function todisplaystring(duration) if duration.h > 0 then return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s) end return string.format("%02d:%02d", duration.m, duration.s) end ---@param frame any ---@return any function p.main(frame) local args = getArgs(frame, ARG_OPTS) return p._main(args, function(s) return frame:preprocess(s) end) end function p._main(args, preprocess) preprocess = preprocess or function(s) return s end local duration = parseDuration(args) local iso = toisostring(duration) local display local is_custom_display = false if args.display then display = preprocess(args.display) is_custom_display = true else display = todisplaystring(duration) end local elem = mw.html.create('time') :attr('datetime', iso) :addClass('duration') :wikitext(display) if is_custom_display then elem:attr('title', todisplaystring(duration)) :addClass('dotted') end return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Duration/styles.css' } } .. tostring(elem) end return p 01e406e1f427ec21571803ddbb608db84f5fb51a 585 584 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported Scribunto text/plain ---Duration module ---@module DurationModule ---@alias p local getArgs = require('Module:Arguments').getArgs local ARG_OPTS = { wrappers = { "Template:Duration" } } ---@class Duration ---@field h ---@field m ---@field s ---@type Duration local ZERO = { h = 0, m = 0, s = 0 } ---@type int[][] local LOOKUP = { [1] = { 0, 0, 1 }, [2] = { 0, 1, 2 }, [3] = { 1, 2, 3 } } local p = {} ---@param args any ---@return Duration local function parseDuration(args) local h = tonumber(args.h or args[1]) local m = tonumber(args.m or args[2]) local s = tonumber(args.s or args[3]) if h or m or s then return { h = h or 0, m = m or 0, s = s or 0 } --[[@as Duration]] end local input = args[1] if not input or input == "" then return ZERO end local parts = {} for part in string.gmatch(input, "%d+") do parts[#parts + 1] = tonumber(part) or 0 end local size = #parts return { h = parts[LOOKUP[size][1]] or 0, m = parts[LOOKUP[size][2]] or 0, s = parts[LOOKUP[size][3]] or 0 } --[[@as Duration]] end ---@param duration Duration ---@return string local function toisostring(duration) return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s) end ---@param duration Duration ---@return string local function todisplaystring(duration) if duration.h > 0 then return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s) end return string.format("%02d:%02d", duration.m, duration.s) end ---@param frame any ---@return any function p.main(frame) local args = getArgs(frame, ARG_OPTS) return p._main(args, function(s) return frame:preprocess(s) end) end function p._main(args, preprocess) preprocess = preprocess or function(s) return s end local duration = parseDuration(args) local iso = toisostring(duration) local display local is_custom_display = false if args.display then display = preprocess(args.display) is_custom_display = true else display = todisplaystring(duration) end local elem = mw.html.create('time') :attr('datetime', iso) :addClass('duration') :wikitext(display) if is_custom_display then elem:attr('title', todisplaystring(duration)) :addClass('dotted') end return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Duration/styles.css' } } .. tostring(elem) end return p 01e406e1f427ec21571803ddbb608db84f5fb51a Module:Duration/styles.css 828 411 582 2025-08-21T17:56:26Z Sharparam 284703 Sharparam moved page [[Template:Duration/styles.css]] to [[Module:Duration/styles.css]] without leaving a redirect: Moving styles to module level sanitized-css text/css time.duration.dotted { border-bottom: 1px dotted; } 3d31243ddfc10500c1050d7e08d4e4ceb60dba74 583 582 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported sanitized-css text/css time.duration.dotted { border-bottom: 1px dotted; } 3d31243ddfc10500c1050d7e08d4e4ceb60dba74 Template:Duration 10 410 580 2025-08-21T17:57:12Z Sharparam 284703 Fix missing start tag wikitext text/x-wiki <includeonly>{{#invoke:Duration|main}}</includeonly><noinclude>{{Documentation}}</noinclude> 46a71dab33136afb3cfda922978ce2a0f128228e 581 580 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Duration|main}}</includeonly><noinclude>{{Documentation}}</noinclude> 46a71dab33136afb3cfda922978ce2a0f128228e Template:Track listing 10 407 575 574 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{#invoke:Track listing|main}}<noinclude> {{documentation}} </noinclude> bef48fe7b046d2e4f4a2ed058a47e1ec3b30ed00 Module:Track listing 828 408 577 576 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported Scribunto text/plain local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local cfg = mw.loadData('Module:Track listing/configuration') -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- -- Add a mixin to a class. local function addMixin(class, mixin) for k, v in pairs(mixin) do if k ~= 'init' then class[k] = v end end end -------------------------------------------------------------------------------- -- Validation mixin -------------------------------------------------------------------------------- local Validation = {} function Validation.init(self) self.warnings = {} self.categories = {} end function Validation:addWarning(msg, category) table.insert(self.warnings, msg) table.insert(self.categories, category) end function Validation:addCategory(category) table.insert(self.categories, category) end function Validation:getWarnings() return self.warnings end function Validation:getCategories() return self.categories end -- Validate a track length. If a track length is invalid, a warning is added. -- A type error is raised if the length is not of type string or nil. function Validation:validateLength(length) checkType('validateLength', 1, length, 'string', true) if length == nil then -- Do nothing if no length specified return nil end local hours, minutes, seconds -- Try to match times like "1:23:45". hours, minutes, seconds = length:match('^(%d+):(%d%d):(%d%d)$') if hours and hours:sub(1, 1) == '0' then -- Disallow times like "0:12:34" self:addWarning( string.format(cfg.leading_0_in_hours, mw.text.nowiki(length)), cfg.input_error_category ) return nil end if not seconds then -- The previous attempt didn't match. Try to match times like "1:23". minutes, seconds = length:match('^(%d?%d):(%d%d)$') if minutes and minutes:find('^0%d$') then -- Special case to disallow lengths like "01:23". This check has to -- be here so that lengths like "1:01:23" are still allowed. self:addWarning( string.format(cfg.leading_0_in_minutes, mw.text.nowiki(length)), cfg.input_error_category ) return nil end end -- Add a warning and return if we did not find a match. if not seconds then self:addWarning( string.format(cfg.not_a_time, mw.text.nowiki(length)), cfg.input_error_category ) return nil end -- Check that the minutes are less than 60 if we have an hours field. if hours and tonumber(minutes) >= 60 then self:addWarning( string.format(cfg.more_than_60_minutes, mw.text.nowiki(length)), cfg.input_error_category ) return nil end -- Check that the seconds are less than 60 if tonumber(seconds) >= 60 then self:addWarning( string.format(cfg.more_than_60_seconds, mw.text.nowiki(length)), cfg.input_error_category ) end return nil end -------------------------------------------------------------------------------- -- Track class -------------------------------------------------------------------------------- local Track = {} Track.__index = Track addMixin(Track, Validation) Track.fields = cfg.track_field_names Track.cellMethods = { number = 'makeNumberCell', title = 'makeTitleCell', writer = 'makeWriterCell', lyrics = 'makeLyricsCell', music = 'makeMusicCell', extra = 'makeExtraCell', length = 'makeLengthCell', } function Track.new(data) local self = setmetatable({}, Track) Validation.init(self) for field in pairs(Track.fields) do self[field] = data[field] end self.number = assert(tonumber(self.number)) self:validateLength(self.length) return self end function Track:getLyricsCredit() return self.lyrics end function Track:getMusicCredit() return self.music end function Track:getWriterCredit() return self.writer end function Track:getExtraField() return self.extra end -- Note: called with single dot syntax function Track.makeSimpleCell(wikitext) return mw.html.create('td') :wikitext(wikitext or cfg.blank_cell) end function Track:makeNumberCell() return mw.html.create('th') :attr('id', string.format(cfg.track_id, self.number)) :attr('scope', 'row') :wikitext(string.format(cfg.number_terminated, self.number)) end function Track:makeTitleCell() local titleCell = mw.html.create('td') titleCell:wikitext( self.title and string.format(cfg.track_title, self.title) or cfg.untitled ) if self.note then titleCell:wikitext(string.format(cfg.note, self.note)) end return titleCell end function Track:makeWriterCell() return Track.makeSimpleCell(self.writer) end function Track:makeLyricsCell() return Track.makeSimpleCell(self.lyrics) end function Track:makeMusicCell() return Track.makeSimpleCell(self.music) end function Track:makeExtraCell() return Track.makeSimpleCell(self.extra) end function Track:makeLengthCell() return mw.html.create('td') :addClass('tracklist-length') :wikitext(self.length or cfg.blank_cell) end function Track:exportRow(columns) local columns = columns or {} local row = mw.html.create('tr') for i, column in ipairs(columns) do local method = Track.cellMethods[column] if method then row:node(self[method](self)) end end return row end -------------------------------------------------------------------------------- -- TrackListing class -------------------------------------------------------------------------------- local TrackListing = {} TrackListing.__index = TrackListing addMixin(TrackListing, Validation) TrackListing.fields = cfg.track_listing_field_names TrackListing.deprecatedFields = cfg.deprecated_track_listing_field_names function TrackListing.new(data) local self = setmetatable({}, TrackListing) Validation.init(self) -- Check for deprecated arguments for deprecatedField in pairs(TrackListing.deprecatedFields) do if data[deprecatedField] then self:addCategory(cfg.deprecated_parameter_category) break end end -- Validate total length if data.total_length then self:validateLength(data.total_length) end -- Add properties for field in pairs(TrackListing.fields) do self[field] = data[field] end -- Evaluate boolean properties self.showCategories = yesno(self.category) ~= false self.category = nil -- Make track objects self.tracks = {} for i, trackData in ipairs(data.tracks or {}) do table.insert(self.tracks, Track.new(trackData)) end -- Find which of the optional columns we have. -- We could just check every column for every track object, but that would -- be no fun^H^H^H^H^H^H inefficient, so we use four different strategies -- to try and check only as many columns and track objects as necessary. do local optionalColumns = {} local columnMethods = { lyrics = 'getLyricsCredit', music = 'getMusicCredit', writer = 'getWriterCredit', extra = 'getExtraField', } local doneWriterCheck = false for i, trackObj in ipairs(self.tracks) do for column, method in pairs(columnMethods) do if trackObj[method](trackObj) then optionalColumns[column] = true columnMethods[column] = nil end end if not doneWriterCheck and optionalColumns.writer then doneWriterCheck = true optionalColumns.lyrics = nil optionalColumns.music = nil columnMethods.lyrics = nil columnMethods.music = nil end if not next(columnMethods) then break end end self.optionalColumns = optionalColumns end return self end -------------------------------------------------------------------------------- -- Function for automatic punctuation for parameters: -- all_writing, all_lyrics, all_music -- Punctuation defaults to '.' unless ':' or '.' already exist -- Automatic punctuation limited to parameter values not containing parser tags -- i.e. <ref>Text</ref>, <nowiki></nowiki>, etc. -------------------------------------------------------------------------------- function fullstop(a) if a ~= mw.text.killMarkers(mw.getCurrentFrame():preprocess(a)) or a:sub(-1,-1) == ":" or a:sub(-1,-1) == "." then return a else return a .. '.' end end function TrackListing:makeIntro() if self.all_writing then return string.format(cfg.tracks_written, fullstop(self.all_writing)) elseif self.all_lyrics and self.all_music then return mw.message.newRawMessage( cfg.lyrics_written_music_composed, self.all_lyrics, fullstop(self.all_music) ):plain() elseif self.all_lyrics then return string.format(cfg.lyrics_written, fullstop(self.all_lyrics)) elseif self.all_music then return string.format(cfg.music_composed, fullstop(self.all_music)) else return nil end end function TrackListing:renderTrackingCategories() if not self.showCategories or mw.title.getCurrentTitle().namespace ~= 0 then return '' end local ret = '' local function addCategory(cat) ret = ret .. string.format('[[Category:%s]]', cat) end for i, category in ipairs(self:getCategories()) do addCategory(category) end for i, track in ipairs(self.tracks) do for j, category in ipairs(track:getCategories()) do addCategory(category) end end return ret end function TrackListing:renderWarnings() if not cfg.show_warnings then return '' end local ret = {} local function addWarning(msg) table.insert(ret, string.format(cfg.track_listing_error, msg)) end for i, warning in ipairs(self:getWarnings()) do addWarning(warning) end for i, track in ipairs(self.tracks) do for j, warning in ipairs(track:getWarnings()) do addWarning(warning) end end return table.concat(ret, '<br>') end function TrackListing:__tostring() -- Root of the output local root = mw.html.create('div') :addClass('track-listing') local intro = self:makeIntro() if intro then root:tag('p') :wikitext(intro) :done() end -- Start of track listing table local tableRoot = mw.html.create('table') tableRoot :addClass('tracklist') -- Overall table width if self.width then tableRoot :css('width', self.width) end -- Header row if self.headline then tableRoot:tag('caption') :wikitext(self.headline or cfg.track_listing) end -- Headers local headerRow = tableRoot:tag('tr') ---- Track number headerRow :tag('th') :addClass('tracklist-number-header') :attr('scope', 'col') :tag('abbr') :attr('title', cfg.number) :wikitext(cfg.number_abbr) -- Find columns to output local columns = {'number', 'title'} if self.optionalColumns.writer then columns[#columns + 1] = 'writer' else if self.optionalColumns.lyrics then columns[#columns + 1] = 'lyrics' end if self.optionalColumns.music then columns[#columns + 1] = 'music' end end if self.optionalColumns.extra then columns[#columns + 1] = 'extra' end columns[#columns + 1] = 'length' -- Find column width local nColumns = #columns local nOptionalColumns = nColumns - 3 local titleColumnWidth = 100 if nColumns >= 5 then titleColumnWidth = 40 elseif nColumns >= 4 then titleColumnWidth = 60 end local optionalColumnWidth = ((100 - titleColumnWidth) / nOptionalColumns) .. '%' titleColumnWidth = titleColumnWidth .. '%' ---- Title column headerRow:tag('th') :attr('scope', 'col') :css('width', self.title_width or titleColumnWidth) :wikitext(cfg.title) ---- Optional headers: writer, lyrics, music, and extra local function addOptionalHeader(field, headerText, width) if self.optionalColumns[field] then headerRow:tag('th') :attr('scope', 'col') :css('width', width or optionalColumnWidth) :wikitext(headerText) end end addOptionalHeader('writer', cfg.writer, self.writing_width) addOptionalHeader('lyrics', cfg.lyrics, self.lyrics_width) addOptionalHeader('music', cfg.music, self.music_width) addOptionalHeader( 'extra', self.extra_column or cfg.extra, self.extra_width ) ---- Track length headerRow:tag('th') :addClass('tracklist-length-header') :attr('scope', 'col') :wikitext(cfg.length) -- Tracks for i, track in ipairs(self.tracks) do tableRoot:node(track:exportRow(columns)) end -- Total length if self.total_length then tableRoot :tag('tr') :addClass('tracklist-total-length') :tag('th') :attr('colspan', nColumns - 1) :attr('scope', 'row') :tag('span') :wikitext(cfg.total_length) :done() :done() :tag('td') :wikitext(self.total_length) end root:node(tableRoot) -- Warnings and tracking categories root:wikitext(self:renderWarnings()) root:wikitext(self:renderTrackingCategories()) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Track listing/styles.css' } } .. tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._main(args) -- Process numerical args so that we can iterate through them. local data, tracks = {}, {} for k, v in pairs(args) do if type(k) == 'string' then local prefix, num = k:match('^(%D.-)(%d+)$') if prefix and Track.fields[prefix] and (num == '0' or num:sub(1, 1) ~= '0') then -- Allow numbers like 0, 1, 2 ..., but not 00, 01, 02..., -- 000, 001, 002... etc. num = tonumber(num) tracks[num] = tracks[num] or {} tracks[num][prefix] = v else data[k] = v end end end data.tracks = (function (t) -- Compress sparse array local ret = {} for num, trackData in pairs(t) do trackData.number = num table.insert(ret, trackData) end table.sort(ret, function (t1, t2) return t1.number < t2.number end) return ret end)(tracks) return tostring(TrackListing.new(data)) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Track listing' }) return p._main(args) end return p ba53211a0ca356f872c9a88324fd2a6a9e8ff30a Module:Track listing/configuration 828 409 579 578 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported Scribunto text/plain return { show_warnings = false, input_error_category = 'Track listings with input errors', collapsed_parameter_category = 'Track listings that use the collapsed parameter ', deprecated_parameter_category = 'Track listings with deprecated parameters', track_field_names = { number = true, title = true, note = true, length = true, lyrics = true, music = true, writer = true, extra = true, }, track_listing_field_names = { width = true, headline = true, all_writing = true, all_lyrics = true, all_music = true, extra_column = true, total_length = true, title_width = true, writing_width = true, lyrics_width = true, music_width = true, extra_width = true, category = true, }, deprecated_track_listing_field_names = { writing_credits = true, lyrics_credits = true, music_credits = true, }, leading_0_in_hours = "Invalid time '%s' (times in format 'h:mm:ss' cannot start with zero)", leading_0_in_minutes = "Invalid time '%s' (times in format 'mm:ss' cannot start with zero)", not_a_time = "Invalid time '%s' (times must be in a format of 'm:ss', 'mm:ss' or 'h:mm:ss')", more_than_60_minutes = "Invalid track length '%s' (if hours are specified, the number of minutes must be less than 60)", more_than_60_seconds = "Invalid track length '%s' (number of seconds must be less than 60)", tracks_written = 'All tracks are written by %s', lyrics_written_music_composed = 'All lyrics are written by $1; all music is composed by $2', lyrics_written = 'All lyrics are written by %s', music_composed = 'All music is composed by %s', track_listing_error = '<strong class="error">Track listing error: %s</strong>', deprecated_collapsed = 'Deprecated collapsed parameter in use.', title = 'Title', number = 'Number', number_abbr = 'No.', track_listing = 'Track listing', writer = 'Writer(s)', lyrics = 'Lyrics', music = 'Music', extra = '{{{extra_column}}}', length = 'Length', blank_cell = '&nbsp;', track_title = '"%s"', untitled = 'Untitled', note = ' (%s)', track_id = 'track%d', number_terminated = '%d.', total_length = 'Total length:' } 5fcb26176f1458c5fdb9b1ba7af4cafc73cbd05a Bleak Faith: Forsaken Original Soundtrack 0 413 587 586 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported wikitext text/x-wiki The '''{{PAGENAME}}''' is a collection of songs that play throughout {{BFF}}. It is composed by [[Martel]] and [[Rade Vukčević]]. The soundtrack contains 44 tracks across all three discs with a combined total runtime of {{Duration|3:30:00|display=three and a half hours}}. == Songs == <!-- // Generated using the following script on the Apple Music page: (function() { const discs = document.querySelectorAll('.section--disc'); console.debug(discs); for (const disc of discs) { const header = disc.querySelector('.disc-header h2.title').textContent; const songs = disc.querySelectorAll('.songs-list .songs-list-row'); let total_length = 0; const songData = Array.from(songs).map(s => { const no = s.querySelector('.songs-list-row__song-index .songs-list-row__column-data').textContent; const title = s.querySelector('.songs-list-row__song-name').textContent; const length = s.querySelector('.songs-list-row__length').textContent; const [mins, secs] = length.split(':').map(l => Number(l)); total_length += mins * 60 + secs; return `| title${no} = ${title}\n| length${no} = ${length}`; }); const tracks = songData.join("\n\n"); const tot_hors = Math.floor(total_length / 60 / 60); const tot_mins = Math.floor((total_length - tot_hors * 60 * 60) / 60); const tot_secs = total_length % 60; const entry = `{{Track listing\n| headline = ${header}\n| total_length = ${tot_hors}:${tot_mins}:${tot_secs}\n\n${tracks}\n}}`; console.info(entry); } })(); --> {{Track listing | headline = Disc 1 | total_length = 1:49:26 | title1 = Premonitions | length1 = 3:19 | title2 = The Monastery | length2 = 8:22 | title3 = Oathsworn | length3 = 4:25 | title4 = The Imperial Siege | length4 = 3:25 | title5 = Concrete Sea | length5 = 4:32 | title6 = Sky Towers | length6 = 9:23 | title7 = Downpour | length7 = 9:12 | title8 = The Serdars | length8 = 8:59 | title9 = The Inquisition | length9 = 5:31 | title10 = The Valley | length10 = 3:34 | title11 = The Trisagion | length11 = 2:12 | title12 = Cloaca Maxima | length12 = 3:15 | title13 = The Call of the Void | length13 = 7:45 | title14 = The Machinarium | length14 = 11:36 | title15 = A Bitter Evening | length15 = 3:58 | title16 = Dreamlight | length16 = 7:32 | title17 = The Instinct | length17 = 2:27 | title18 = Recycled | length18 = 3:00 | title19 = Domus Aurea | length19 = 6:59 }} {{Track listing | headline = Disc 2 | total_length = 48:46 | title1 = Aurelian | length1 = 5:31 | title2 = Vangelian | length2 = 4:13 | title3 = Machinebirth | length3 = 4:52 | title4 = Melanion | length4 = 6:15 | title5 = Oberon | length5 = 5:10 | title6 = Serapian | length6 = 5:35 | title7 = Limitless | length7 = 4:54 | title8 = The Fade | length8 = 2:42 | title9 = Wandering | length9 = 4:50 | title10 = Machinedream | length10 = 4:44 }} {{Track listing | headline = Disc 3 | total_length = 52:11 | title1 = The Mountain Wreath | length1 = 2:21 | title2 = Destiny | length2 = 8:45 | title3 = Saberstorm | length3 = 2:59 | title4 = Yaroslav's Rebellion | length4 = 5:09 | title5 = The Nightmare (Menu Theme) | length5 = 2:27 | title6 = Konrad the Traitor | length6 = 2:49 | title7 = Yuliya | length7 = 2:53 | title8 = Nemesis | length8 = 3:04 | title9 = Belisarius | length9 = 3:18 | title10 = Aberrant Knight | length10 = 3:02 | title11 = Nurgei | length11 = 3:15 | title12 = Wormlord | length12 = 3:53 | title13 = Wyvern's Lament | length13 = 3:52 | title14 = Doppelganger | length14 = 2:22 | title15 = Baryak | length15 = 2:02 }} == External links == * [https://open.spotify.com/album/1cORrZ4GAVDbMvbEbvEL4q Spotify] * [https://music.apple.com/ua/album/bleak-faith-original-soundtrack/1678680781 Apple Music] * [https://martelvladimiroff.bandcamp.com/album/bleak-faith-forsaken Bandcamp] d8060222851027ad9a4b2724ead306d2de16f292 Module:Track listing/styles.css 828 414 589 588 2025-08-21T17:59:12Z Sharparam 284703 1 revision imported sanitized-css text/css /* {{pp|small=y}} */ .tracklist { border-spacing: 0; } /* set on all rows we can set the total length row to transparent */ .tracklist tr { background-color: var(--background-color-base, #fff); } .tracklist tr:nth-child(2n-1) { background-color: var(--background-color-neutral-subtle, #f8f9fa); } .tracklist caption { text-align: left; font-weight: bold; } .tracklist td, .tracklist th[scope="row"] { vertical-align: top; } .tracklist th[scope="col"] { text-align: left; background-color: var(--background-color-neutral, #eaecf0); } .tracklist th.tracklist-length-header, .tracklist th.tracklist-number-header, .tracklist th[scope="row"], .tracklist-length, .tracklist-total-length td { padding-right: 10px; text-align: right; } .tracklist th[scope="row"] { font-weight: normal; } .tracklist-number-header { width: 2em; padding-left: 10px; } .tracklist-length-header { width: 4em; } .tracklist tr.tracklist-total-length { background-color: transparent; } .tracklist .tracklist-total-length th { padding: 0; font-weight: bold; } .tracklist-total-length th > span { float: right; padding: 0 10px; background-color: var(--background-color-neutral, #eaecf0); } .tracklist-total-length td { background-color: var(--background-color-neutral, #eaecf0); font-weight: bold; padding: 0 10px 0 0; } bc12ba45209a6a001e4bfaed9bda7f8aff5d3334 Module:Hatnote/styles.css 828 415 590 2025-08-21T18:00:01Z Sharparam 284703 Created page with "/* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } @media print { body.ns-0 .hatnote { display: none !impo..." sanitized-css text/css /* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } @media print { body.ns-0 .hatnote { display: none !important; } } aa61a27060ce48815745f5b81624c7fd95b51b82 Bleak Faith: Forsaken Wiki/about 0 6 591 11 2025-08-21T18:02:04Z Sharparam 284703 Link to BFF article wikitext text/x-wiki {{Main page box/start | title = About [[Bleak Faith: Forsaken]] }} This is an example main page. You can redesign it however you want, or you can keep the layout the same but change the contents (e.g. this part should talk about your game). Take a look at some other wiki.gg wikis for inspiration! <div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 525e985f7465f983b7dbfb9dc8b65b3a47787c0b Bleak Faith: Forsaken Wiki/pages 0 5 592 9 2025-08-21T18:04:17Z Sharparam 284703 Improve example links wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Items!}} * {{MP link|Random page|link=Special:Random}} * {{MP link|Example character|link=The Handler}} * {{MP link|Example weapon|link=Katanas|image=Katanas.png|size=92px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> ee9c73ccd6857df2fd240662164ee1044bcd17b3 593 592 2025-08-21T18:05:07Z Sharparam 284703 Fix link to items wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Items!|link=Items}} * {{MP link|Random page|link=Special:Random}} * {{MP link|Example character|link=The Handler}} * {{MP link|Example weapon|link=Katanas|image=Katanas.png|size=92px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 8ef2b26c945f269ede16829e646573a854bdd28f Items 0 416 595 594 2025-08-21T18:09:59Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects. {{Navbox/Items}} f9e1d38d5ce67ef854c74e6280c1d93d64ed929f 630 595 2025-08-21T18:10:44Z Sharparam 284703 Add category wikitext text/x-wiki '''{{PAGENAME}}''' come in various forms, from [[equipment]] that can be worn by the player, to [[consumables]] that can be used for various effects. {{Navbox/Items}} [[Category:Items]] 5f640b156bc0e2b0a2f746a56e536f618b5120fe Template:Infobox/Item 10 417 597 596 2025-08-21T18:09:59Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{#if:{{NAMESPACE}}||[[Category:Items]]}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> 5d4929aef36fffdaea5150152baf68fb562131a0 Category:Essential items 14 418 599 598 2025-08-21T18:10:00Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Category:Upgrade items 14 419 601 600 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Greater Anomalous Crystal 0 420 603 602 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is an [[Items|item]] found in {{BFF}}. It can be embedded into [[weapons]] or [[armor]] to improve their properties. == Variants == There are several different variants of the crystal that all share the same name in-game, differing only by their visual appearance and the effects they give when embedded into [[equipment]]. They have received ad-hoc names on the wiki temporarily to be able to differentiate them. The names are assigned based on the item's appearance. === "Purple jagged" === * '''Effect in [[armor]]:''' +25 max [[flux]] points. * '''Effect in [[weapons]]:''' +8% [[technomancy]] penetration. === "Orange shield" === * '''Effect in [[armor]]:''' +30% base weapon damage. * '''Effect in [[weapons]]:''' +9% attack power. === "Ruby" === * '''Effect in [[armor]]:''' +75 max health points. * '''Effect in [[weapons]]:''' +15% critical damage. == Locations == {| class="wikitable sortable" ! scope="col" | Area ! scope="col" class="unsortable" | Description ! scope="col" class="unsortable" | Coordinates ! scope="col" | Variant |- | [[Blok 6147]] || For now, refer to a walkthrough video on Discord.[https://discord.com/channels/541778372997677056/1087019327712133140/1087020918221590608] || {{coords|-1155|-1340|2635}} || Orange shield |- | [[Deluge]] || Starting from the first [[homunculus]] in the area, climb the stairs (past [[The Handler]]) and enter the small tower inhabited by a [[Diver]] [[Enemies|enemy]]. Look over the edge and you'll see a rusty walkway circling the tower. Drop down onto the walkway and follow it to the right (the direction the enemy was facing) and keep following it to find a ladder going up. Climb the ladder and continue straight to notice a gap in the floor, jump the gap and continue forward to find the crystal. (Going down the gap leads to a post-process effect unlock ("Dramatic").) || {{coords|-3178|-1346|5700}} || Purple jagged |- | [[Uranopolis]] || Next to a tree near the giant enemy that drops [[Ring of Casting Speed]]. || {{coords|-2185|-4082|1473}} || Orange shield |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head up the big stairs and take the left path. At the end is a big cliff. Walk near the cliff and use the jump button repeatedly to climb to the top of the cliff. The item is on the edge of the cliff. || {{coords|1246|-8872|1517}} || Ruby |} {{Navbox/Items}} [[Category:Items]] [[Category:Anomalous crystals]] f3dbb5471d067f2759e3b9ef743f9c6ebc7f3619 Handler Echo 0 421 605 604 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | image = Handler Echo.png | title = {{PAGENAME}} | Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to. == Usage == If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level. == Acquisition == * Drops from [[Konrad the Traitor]]. * Can drop from samurai enemies in [[Uranopolis]] (limited to one drop). == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}} |- | [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}} |- | [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}} |} {{Navbox/Items}} [[Category:Essential items]] 8e39742af7d396a0340cfbf20893f0518504a05a Plagued Blood 0 422 607 606 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Plagued Blood.png | Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant. }} == Location == {{coords|-3898|1671|1585}} Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table. == Usage == Having this item in your inventory allows for spawning some optional bosses. * [[Plagued Warden]] * [[Plagued Revenant]] {{Navbox/Items}} [[Category:Essential items]] 1f8d91aaf3bd07906a2a403a6db0b8ae9ee60325 Homunculus Mirage 0 423 609 608 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | tabs=Normal,Husk | Normal_title = Homunculus Mirage | Husk_title = Humunculus Mirage Husk | images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]] | Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation. | Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere. }} {{Navbox/Items}} [[Category:Essential items]] 8fb75994fa6cda97b1ebe8cfd760652188977f94 Perk Essence 0 424 611 610 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | tabs = Stable,Unstable | images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]] | Stable_title = Perk Essence | Unstable_title = Unstable Perk Essence | Stable_Description = An artifact used in the process of embedding perks. | Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades. == Acquisition == The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]]. Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again. {{Navbox/Items}} [[Category:Essential items]] e1971e413ec50fbb2dc150383cacbe574eece1c5 Upgrade Module 0 425 613 612 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Upgrade Module.png | Description = A rare artifact used in the process of upgrading gear. }} '''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5. {{Navbox/Items}} [[Category:Essential items]] [[Category:Upgrade items]] f405ef0912d49ef39a269fb10d08d14c1e5322bb Anomalous Fragment 0 426 615 614 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Anomalous Fragment.png | Description = [[The Handler|Handler]] may convert it to a more useful form. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Acquisition == Drops from [[bosses]] in [[NG+]]. == Usage == Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]]. [[Category:Essential items]] 7980e000ddcb82018f50487ce22ffa9df9abbde2 Anomalous crystals 0 427 617 616 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties. == Overview == There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''. Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever. {{Navbox/Items}} [[Category:Anomalous crystals]] 5cef9dfbb687f0e77132dcb7450a11e973b25b95 Consumables 0 428 619 618 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[Items|item]] that the player can use to heal themselves, restore resources, or gain various buffs. {{Navbox/Consumables}} d9a89e867297dd4ee6e2667cdb541b327cdc74e4 Old Key 0 429 621 620 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Old Key.png | Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]]. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Location == {{coords|19328.57|-41596.65|3.83}} Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up. == Usage == Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it). {{Navbox/Items}} a6c6a09cf952e26c4386195a47267f9112b2ac5e Ability Splinter 0 430 623 622 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]]. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them. |} {{Navbox/Items}} [[Category:Essential items]] 7b6f4fe171581f79b13cd24ed99204aef452dab4 Materials 0 431 625 624 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. {{Navbox/Materials}} 16c02de5636f61c53bd16cf7e1d04625cb9646e2 Upgrade Splinter 0 432 627 626 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}} |} {{Navbox/Items}} [[Category:Upgrade items]] b5014301a8a656873f94d981f8cd2ac3b7f1bbb7 Gingko Leaves 0 433 629 628 2025-08-21T18:10:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]]. == Acquisition == Drops from several enemies in the game, as well as found on the ground in certain locations. == Locations == {| class="wikitable" ! Amount !! Area !! Description !! Coordinates |- | 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}} |} {{Navbox/Materials}} [[Category:Materials]] 0fbff16a09a73af85c8ed1146f701144d7062005 Category:Items 14 434 631 2025-08-21T18:11:06Z Sharparam 284703 Created page with "[[Items]] in {{BFF}}." wikitext text/x-wiki [[Items]] in {{BFF}}. 16568f5641e17cc4807c868d51448584c4eee705 Homunculus Mirage Husk 0 435 632 2025-08-21T18:12:26Z Sharparam 284703 Redirected page to [[Homunculus Mirage]] wikitext text/x-wiki #REDIRECT [[Homunculus Mirage]] 4c51bab80fcbd9a41985179f691020f9d2813124 Unstable Perk Essence 0 436 633 2025-08-21T18:12:56Z Sharparam 284703 Redirected page to [[Perk Essence]] wikitext text/x-wiki #REDIRECT [[Perk Essence]] e79a9129b7510dd8f427798b8611e23429960e63 Template:Navbox/Equipment 10 437 635 634 2025-08-21T18:16:06Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Equipment | title = [[Equipment]] | group1 = [[Weapons]] | list1 = {{Navbox/Weapons|child}} | group2 = [[Armor]] | list2 = {{Navbox/Armor|child}} | group3 = [[Amulets]] | list3 = {{Navbox/Amulets|child}} | group4 = [[Rings]] | list4 = {{Navbox/Rings|child}} | group5 = [[Capes]] | list5 = {{Navbox/Capes|child}} }} 4e9b09f139c8eefe809a3e0918f7584ff16eb363 644 635 2025-08-21T18:17:24Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Equipment | title = [[Equipment]] | group1 = [[Weapons]] | list1 = {{Navbox/Weapons|child}} | group2 = [[Armor]] | list2 = {{Navbox/Armor|child}} | group3 = [[Amulets]] | list3 = {{Navbox/Amulets|child}} | group4 = [[Rings]] | list4 = {{Navbox/Rings|child}} | group5 = [[Capes]] | list5 = {{Navbox/Capes|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 73577a6e1a11270ffa35063d0266aa7a7766cf89 Template:Navbox/Weapons 10 438 637 636 2025-08-21T18:16:06Z Sharparam 284703 1 revision imported wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] | group3 = [[Ranged weapons|Ranged]] | group3.1 = [[Longbows]] | list3.1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] | group3.2 = [[Staves]] | list3.2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude> 441db50a6ddfe17d473822864f9d20f3a2af385f 645 637 2025-08-21T18:18:01Z Sharparam 284703 Add category, remove documentation template wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] | group3 = [[Ranged weapons|Ranged]] | group3.1 = [[Longbows]] | list3.1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] | group3.2 = [[Staves]] | list3.2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 8e94326ebfefa20b4393ca4d4fc2a6076e02c41d Template:Navbox/Armor 10 439 639 638 2025-08-21T18:16:06Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Crude Helmet]] * [[Deserts Respirator Helmet]] * [[Eris]] * [[Librarian Hood]] * [[Plagued Revenant Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Techpriest Helmet]] | group2 = [[Pauldrons]] | group3 = [[Chestguards]] | list3 = * [[Citadel Warrior Chest]] * [[Corrupted Cuirass]] * [[Librarian Overcoat]] * [[Sentinel Chest]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>{{Documentation}}</noinclude> d47fdce5305e2ded83cd423d5b2674c32d0dde4d 646 639 2025-08-21T18:18:25Z Sharparam 284703 Add category, remove documentation template wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Crude Helmet]] * [[Deserts Respirator Helmet]] * [[Eris]] * [[Librarian Hood]] * [[Plagued Revenant Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Techpriest Helmet]] | group2 = [[Pauldrons]] | group3 = [[Chestguards]] | list3 = * [[Citadel Warrior Chest]] * [[Corrupted Cuirass]] * [[Librarian Overcoat]] * [[Sentinel Chest]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> d68b49e449593d76c716ece8ba21c99d8eac2ea7 Template:Navbox/Shields 10 440 641 640 2025-08-21T18:16:06Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Shields | title = [[Shields]] | list1 = * [[Flat Shield]] * [[Kite Shield]] * [[Military Shield]] * [[Saracen Shield]] * [[Spiked Shield]] * [[Tall Military Shield]] * [[Tech Shield]] * [[Wooden Shield]] }} 86b51292309060d7ff355bad7dc03a02f84ab69b 647 641 2025-08-21T18:18:48Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Shields | title = [[Shields]] | list1 = * [[Flat Shield]] * [[Kite Shield]] * [[Military Shield]] * [[Saracen Shield]] * [[Spiked Shield]] * [[Tall Military Shield]] * [[Tech Shield]] * [[Wooden Shield]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 104b8f0f103ef13f482417a9ededcf3a6c308f5a Template:Navbox/Amulets 10 441 643 642 2025-08-21T18:16:07Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane Protection]] * [[Amulet of Evasion]] * [[Tactician's Amulet]] }} 52e610bdb0cd1e26a433d4a731efea2e044132e1 648 643 2025-08-21T18:19:12Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane Protection]] * [[Amulet of Evasion]] * [[Tactician's Amulet]] }}<noinclude>[[Category:Navigation templates]]</noinclude> d43f33c31d7d77cfbae1cf4feb8facc7897d7b18 Rings 0 442 650 649 2025-08-21T18:20:39Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] that can be worn by the player to gain certain effects. {{Navbox/Rings}} [[Category:Rings]] 7adf2438732889de3ab3158748516564e3c337cb Capes 0 443 652 651 2025-08-21T18:20:39Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] the player can wear to gain various bonus stats or effects. {{Navbox/Capes}} e68b383acdf3f302a6ce54944a3b34f545506c55 Amulets 0 444 654 653 2025-08-21T18:20:39Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox/Amulets}} c49a050c320d9cc83e8ac20203557bb1adb26913 Shields 0 445 656 655 2025-08-21T18:20:39Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] that can be used to protect the player against incoming [[damage]]. {{Navbox/Shields}} [[Category:Shields]] 1e7147da72fc96843c2350072a5e579292f4c0ac Template:Navbox/Materials 10 446 657 2025-08-21T18:21:24Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Materials | title = [[Materials]] | list1= * [[Essence]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Gravicle Dust]] * [[Machinite]] * [[Neurilium]] * [[Rustvine]] * [[Sludge]] * [[Spectral Ash]] }}<noinclude>[[Category:Navigation templates]]</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Materials | title = [[Materials]] | list1= * [[Essence]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Gravicle Dust]] * [[Machinite]] * [[Neurilium]] * [[Rustvine]] * [[Sludge]] * [[Spectral Ash]] }}<noinclude>[[Category:Navigation templates]]</noinclude> cd837e985ae9888fcc2a331afb915045b81932ff Template:Armor/CargoDeclare 10 447 659 658 2025-08-21T18:35:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{#cargo_declare:_table=Armor |name=String |setname=String |type=String |weight=String |sharpMk0=Integer |bluntMk0=Integer |technomancyMk0=Integer |sharpMk1=Integer |bluntMk1=Integer |technomancyMk1=Integer |sharpMk2=Integer |bluntMk2=Integer |technomancyMk2=Integer |sharpMk3=Integer |bluntMk3=Integer |technomancyMk3=Integer |sharpMk4=Integer |bluntMk4=Integer |technomancyMk4=Integer |sharpMk5=Integer |bluntMk5=Integer |technomancyMk5=Integer }} 338fa661fc066d90571ae8a2a2f747cb2c0d8f4f Template:Weapons/CargoDeclare 10 448 661 660 2025-08-21T18:35:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{#cargo_declare:_table=Weapons |name=String |type=String |speed=String |damageType=String |damageMk0Min=Integer |damageMk0Max=Integer |damageMk1Min=Integer |damageMk1Max=Integer |damageMk2Min=Integer |damageMk2Max=Integer |damageMk3Min=Integer |damageMk3Max=Integer |damageMk4Min=Integer |damageMk4Max=Integer |damageMk5Min=Integer |damageMk5Max=Integer }} 058226c206cdffeac8dd6c20fbd40d7a4b81f948 Template:Weapons/CargoStore 10 449 663 662 2025-08-21T18:35:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#cargo_store:_table=Weapons |name={{{name|}}} |type={{{type|}}} |speed={{{speed|}}} |damageType={{{damageType|}}} |damageMk0Min={{{damageMk0Min|}}} |damageMk0Max={{{damageMk0Max|}}} |damageMk1Min={{{damageMk1Min|}}} |damageMk1Max={{{damageMk1Max|}}} |damageMk2Min={{{damageMk2Min|}}} |damageMk2Max={{{damageMk2Max|}}} |damageMk3Min={{{damageMk3Min|}}} |damageMk3Max={{{damageMk3Max|}}} |damageMk4Min={{{damageMk4Min|}}} |damageMk4Max={{{damageMk4Max|}}} |damageMk5Min={{{damageMk5Min|}}} |damageMk5Max={{{damageMk5Max|}}} }}</includeonly><noinclude>{{#cargo_attach:table=Weapons}}</noinclude> f0f50597b71007312dd924dfdbdaec0c577db10f Template:Armor/CargoStore 10 450 665 664 2025-08-21T18:35:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#cargo_store:_table=Armor |name={{{name|}}} |setname={{{setname|}}} |type={{{type|}}} |weight={{{weight|}}} |sharpMk0={{{sharpMk0|}}} |bluntMk0={{{bluntMk0|}}} |technomancyMk0={{{technomancyMk0|}}} |sharpMk1={{{sharpMk1|}}} |bluntMk1={{{bluntMk1|}}} |technomancyMk1={{{technomancyMk1|}}} |sharpMk2={{{sharpMk2|}}} |bluntMk2={{{bluntMk2|}}} |technomancyMk2={{{technomancyMk2|}}} |sharpMk3={{{sharpMk3|}}} |bluntMk3={{{bluntMk3|}}} |technomancyMk3={{{technomancyMk3|}}} |sharpMk4={{{sharpMk4|}}} |bluntMk4={{{bluntMk4|}}} |technomancyMk4={{{technomancyMk4|}}} |sharpMk5={{{sharpMk5|}}} |bluntMk5={{{bluntMk5|}}} |technomancyMk5={{{technomancyMk5|}}} }}</includeonly><noinclude>{{#cargo_attach:table=Armor}}</noinclude> 333780ac478dc35967062b394838e177b662daa9 Template:Infobox/Weapon 10 451 667 666 2025-08-21T18:35:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | ranged = [[Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 6ed81445f4e99c129429ea030ff07667c32cc439 Template:Infobox/Weapon/doc 10 452 669 668 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for weapons", "params": { "title": { "label": "Weapon name", "description": "The name of the weapon", "required": false, "default": "{{PAGENAME}}", "example": "Cool Sword", "type": "string" }, "image": { "label": "Weapon image", "description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.", "required": true, "example": "Cool weapon.png", "type": "wiki-file-name" }, "Type": { "label": "Weapon type", "description": "The type of the weapon.", "required": true, "example": "Dual Wields", "type": "wiki-page-name" }, "Speed": { "label": "Weapon speed", "description": "The speed category of the weapon.", "required": true, "example": "Fast", "type": "string" }, "Damage type": { "label": "Weapon damage type", "description": "The type of damage dealt by the weapon.", "required": true, "example": "Sharp", "type": "wiki-page-name" }, "Passives": { "label": "Passive properties", "description": "Any passive properties the weapon has, comma separated", "required": false, "example": "Health Regen, Flux Regen", "type": "string" }, "Abilities": { "label": "Active abilities", "description": "Active abilities that can be used when the weapon is equipped, comma separated", "required": false, "example": "Blade Dance", "type": "string" }, "Mk_min": { "label": "Minimum mark level", "description": "The initial mark level of the weapon", "required": false, "default": "0", "example": "3", "type": "number" }, "Mk0_Damage_min": { "label": "Min. damage at Mk. 0", "description": "Minimum damage the weapon deals at Mk. 0", "required": true, "example": "5", "type": "number" }, "Mk0_Damage_max": { "label": "Max. damage at Mk. 0", "description": "Maximum damage the weapon deals at Mk. 0", "required": true, "example": "8", "type": "number" }, "Mk1_Damage_min": { "label": "Min. damage at Mk. 1", "description": "Minimum damage the weapon deals at Mk. 1", "required": true, "example": "5", "type": "number" }, "Mk1_Damage_max": { "label": "Max. damage at Mk. 1", "description": "Maximum damage the weapon deals at Mk. 1", "required": true, "example": "8", "type": "number" }, "Mk2_Damage_min": { "label": "Min. damage at Mk. 2", "description": "Minimum damage the weapon deals at Mk. 2", "required": true, "example": "10", "type": "number" }, "Mk2_Damage_max": { "label": "Max. damage at Mk. 2", "description": "Maximum damage the weapon deals at Mk. 2", "required": true, "example": "15", "type": "number" }, "Mk3_Damage_min": { "label": "Min. damage at Mk. 3", "description": "Minimum damage the weapon deals at Mk. 3", "required": true, "example": "20", "type": "number" }, "Mk3_Damage_max": { "label": "Max. damage at Mk. 3", "description": "Maximum damage the weapon deals at Mk. 3", "required": true, "example": "25", "type": "number" }, "Mk4_Damage_min": { "label": "Min. damage at Mk. 4", "description": "Minimum damage the weapon deals at Mk. 4", "required": true, "example": "30", "type": "number" }, "Mk4_Damage_max": { "label": "Max. damage at Mk. 4", "description": "Maximum damage the weapon deals at Mk. 4", "required": true, "example": "40", "type": "number" }, "Mk5_Damage_min": { "label": "Min. damage at Mk. 5", "description": "Minimum damage the weapon deals at Mk. 5", "required": true, "example": "50", "type": "number" }, "Mk5_Damage_max": { "label": "Max. damage at Mk. 5", "description": "Maximum damage the weapon deals at Mk. 5", "required": true, "example": "60", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Weapon | title = Cool Sword | image = Sword_01.svg | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen,Stuff,Cool | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Weapon | title = Cool Sword | image = Sword_01.svg | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} </syntaxhighlight> 03d55ce17e93a95147326d083a21a60c735a4602 Template:Infobox/Armor 10 453 671 670 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helmet = [[Helmet]] | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard = [[Legguard]] | gauntlet = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{hlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> b1b6719714f0e3277010b8ca8d5ecb76f9538378 Template:Infobox/Armor/doc 10 454 673 672 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for armor", "params": { "image": { "label": "Armor image", "description": "Name of the file used as the image for the armor, should be at least 300 pixels wide.", "required": true, "example": "Cool armor.png", "type": "wiki-file-name" }, "Type": { "label": "Armor type", "description": "The type of armor.", "required": true, "example": "Helmet", "type": "wiki-page-name" }, "Weight": { "label": "Armor weight", "description": "The weight class of the armor.", "required": true, "example": "Light", "type": "string" }, "Set": { "label": "Armor set", "description": "Name of an armor set, if the piece is part of one.", "required": false, "example": "Cool set", "type": "wiki-page-name" }, "Passives": { "label": "Passive effects", "description": "Comma-separated list of passive effects", "required": false, "example": "Regen HP, Regen FX", "type": "string" }, "Mk1_Sharp": { "label": "Mk 1 sharp rating", "description": "Sharp defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Blunt": { "label": "Mk 1 blunt rating", "description": "Blunt defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Technomancy": { "label": "Mk 1 technomancy rating", "description": "Technomancy defense rating at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk2_Sharp": { "label": "Mk 2 sharp rating", "description": "Sharp defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Blunt": { "label": "Mk 2 blunt rating", "description": "Blunt defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Technomancy": { "label": "Mk 2 technomancy rating", "description": "Technomancy defense rating at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk3_Sharp": { "label": "Mk 3 sharp rating", "description": "Sharp defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Blunt": { "label": "Mk 3 blunt rating", "description": "Blunt defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Technomancy": { "label": "Mk 3 technomancy rating", "description": "Technomancy defense rating at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk4_Sharp": { "label": "Mk 4 sharp rating", "description": "Sharp defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Blunt": { "label": "Mk 4 blunt rating", "description": "Blunt defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Technomancy": { "label": "Mk 4 technomancy rating", "description": "Technomancy defense rating at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk5_Sharp": { "label": "Mk 5 sharp rating", "description": "Sharp defense rating at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Blunt": { "label": "Mk 5 blunt rating", "description": "Blunt defense rating at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Technomancy": { "label": "Mk 5 technomancy rating", "description": "Technomancy defense rating at Mk 5", "required": true, "example": "5", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Armor | image = Helmet 2-1 SVG.svg | title = Awesome helmet | Type = Helmet | Weight = Heavy | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} <syntaxhighlight lang="wikitext"> {{Infobox/Armor | image = Helmet 2-1 SVG.svg | title = Awesome helmet | Type = Helmet | Weight = Heavy | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} </syntaxhighlight> 03d97e9c6ffe6abdc853a4e886a5526e3ca4922d Template:Infobox/Armor set 10 455 675 674 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor-set |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Pieces, Stats |Basic Info=Weight |Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets |Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}} |Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}} |Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}} |Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}} |Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}} |tabs= Mk1, Mk2, Mk3, Mk4, Mk5 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude> {{Documentation}}[[Category:Infobox templates]]</noinclude> d0b44e9f72dec247f40dfa79c3541b37ed9c3937 Template:Infobox/Armor set/doc 10 456 677 676 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for an armor set", "params": { "image": { "label": "Armor set image", "description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.", "required": true, "example": "Cool armor set.png", "type": "wiki-file-name" }, "Weight": { "label": "Armor set weight", "description": "The weight class of the armor set.", "required": true, "example": "Light", "type": "string" }, "Helmet": { "label": "Helmet piece", "description": "The armor used for the helmet slot.", "required": true, "example": "Cool Helmet", "type": "wiki-page-name" }, "Pauldrons": { "label": "Pauldrons piece", "description": "The armor used for the pauldrons slot.", "required": true, "example": "Cool Pauldrons", "type": "wiki-page-name" }, "Chestguard": { "label": "Chestguard piece", "description": "The armor used for the chestguard slot.", "required": true, "example": "Cool Chestguard", "type": "wiki-page-name" }, "Legguard": { "label": "Legguard piece", "description": "The armor used for the legguard slot.", "required": true, "example": "Cool Legguard", "type": "wiki-page-name" }, "Gauntlets": { "label": "Gauntlets piece", "description": "The armor used for the gauntlets slot.", "required": true, "example": "Cool Gauntlets", "type": "wiki-page-name" }, "Mk1_Sharp": { "label": "Mk 1 sharp rating", "description": "Total sharp defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Blunt": { "label": "Mk 1 blunt rating", "description": "Total blunt defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Technomancy": { "label": "Mk 1 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk2_Sharp": { "label": "Mk 2 sharp rating", "description": "Total sharp defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Blunt": { "label": "Mk 2 blunt rating", "description": "Total blunt defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Technomancy": { "label": "Mk 2 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk3_Sharp": { "label": "Mk 3 sharp rating", "description": "Total sharp defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Blunt": { "label": "Mk 3 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk3_Technomancy": { "label": "Mk 3 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk4_Sharp": { "label": "Mk 4 sharp rating", "description": "Total sharp defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Blunt": { "label": "Mk 4 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Technomancy": { "label": "Mk 4 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk5_Sharp": { "label": "Mk 5 sharp rating", "description": "Total sharp defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Blunt": { "label": "Mk 5 blunt rating", "description": "Total blunt defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Technomancy": { "label": "Mk 5 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} <syntaxhighlight lang="wikitext"> {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} </syntaxhighlight> 0b9b19ca76ed3cf82ad6c4644f7d39ea57f56907 Template:Infobox/Shield 10 457 679 678 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=shield |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Weight,Passives,Abilities |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}} |Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}} |Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}} |Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}} |Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}} |Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}} |Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}} |Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}} |Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}} |Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}} |Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}} |Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}} |Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}} |Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}} |Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}} |Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}} |Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}} |Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}} }}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 879802ba38814822053b519e3543784bf8a6ee64 Template:Infobox/Shield/doc 10 458 681 680 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Examples == {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Shield | image = Test shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} </syntaxhighlight> f660f4831abeb203edfc85fcc8225afbe28becd3 Template:Infobox/Ability 10 459 683 682 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=ability |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info,Description |Basic Info=Cost,Cooldown |Cost_label=Flux cost |Cooldown={{#if:{{{Cooldown|}}}|{{{Cooldown}}}&nbsp;seconds}} |Description_nolabel=yes |Description_isdata=yes }}{{#if:{{NAMESPACE}}||[[Category:Abilities]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> c1ad1894018a724cf6235cea17b860aa85344fed Template:Infobox/Ability/doc 10 460 685 684 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Example == {{Infobox/Ability |image=SuperTux star-1.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} <syntaxhighlight lang="wikitext"> {{Infobox/Ability |image=SuperTux star-1.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} </syntaxhighlight> c5af8361e58c9662fafe1e9ae1dfbc09ff0dedf9 Template:Infobox/Boss 10 461 687 686 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind = boss | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance | SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}} | BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}} | TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}} }}{{#if:{{NAMESPACE}}||[[Category:Bosses]]}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]] </noinclude> 64710a105198d7712f12bdaeab6e515bd71f2fe8 Template:Infobox/Cape 10 462 689 688 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=cape |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Effects |Effects=Effect1,Effect2,Effect3 |Effect1_nolabel=yes |Effect2_nolabel=yes |Effect3_nolabel=yes }}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 1957e3d416bf10a10bad93e51f649ad4f1768848 Template:Infobox/Cape/doc 10 463 691 690 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Examples == {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} <syntaxhighlight lang="wikitext"> {{Infobox/Cape | image = Cool cape.png | title = Cool cape | Effect1 = +50 coolness | Effect2 = -1s cooldowns }} </syntaxhighlight> 90d89e60cc634d47fd7681de76278937e16255fc Template:Infobox/Item/doc 10 464 693 692 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | Description = This item will do something fancy when you use it! }} </syntaxhighlight> 9a956a5275f4ed54d4ffea9d646a5229cadc93a6 Weapons 0 465 695 694 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]]. == Upgrading == Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials. Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded. == List of weapons == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |format=table }} {{Navbox/Weapons}} 627eeadeab2f527ee330ed3f5b806dcef85b45e8 Armor 0 466 697 696 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is protective [[equipment]] that can be worn to increase defensive stats. == List of armor == {{#cargo_query:table=Armor |fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, weight=Weight |format=table }} {{Navbox/Armor}} 9bd135cf1860c6152460f40d36e8fe2636fd7ef3 Equipment 0 467 699 698 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] that the player can wear. {{Navbox/Equipment}} c2de744eb63e9dbba3e8fff73404a00624386c66 Category:Weapons 14 468 701 700 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Weapons''' are equipment the player can use to damage monsters and defend themselves. 98e971be059993e01129097dd2602abe573ed443 Category:Dual Wields 14 469 703 702 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Weapons]] febdf29cf9dcbef034e184720fe19a5ac5f353d8 Divine Greataxe 0 470 705 704 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Divine Greataxe.png | Type = Greatweapon | Damage type = Sharp | Speed = Sluggish | Passives = Greater Divine Judgment | Abilities = Regal Radiance | Mk4_Damage_min = 597 | Mk4_Damage_max = 656 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. == Location == {{coords|43210.37|165132.67|-141105.39}} Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building. {{Navbox/Weapons}} 0ae771a14e6b5fd5c63e8a73b5aebd90154e8bff Category:Chestguards 14 471 707 706 2025-08-21T18:35:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Dual Wield 0 472 709 708 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Stub}} '''{{PAGENAME}}''' is a [[Weapons|weapon]] type in {{BFF}}. == List of Dual Wields == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |where=type='Dual Wield' |format=table }} [[Category:Dual Wields]] 6c2224d2e50f2da2b16a52ca04227ca57d27bbc8 Dual wield 0 473 711 710 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Dual Wield]] f2856295451ab1cd2a686e19d6b0fbaa265f1d98 Dual Wields 0 474 713 712 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Dual Wield]] f2856295451ab1cd2a686e19d6b0fbaa265f1d98 Katanas 0 475 715 714 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Katanas.png | Type = Dual Wield | Speed = Fast | Damage type = Sharp | Abilities = Blade Dash, Whirlwind Strike | Mk3_Damage_min = 117 | Mk3_Damage_max = 130 | Mk4_Damage_min = 165 | Mk4_Damage_max = 183 | Mk5_Damage_min = 235 | Mk5_Damage_max = 261 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Available as a drop from [[enemies]] in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. {{Navbox/Weapons}} 4ab46d81614502ef87bbdcd436c9621993e809bd Kamas 0 476 717 716 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Kamas.png | Type = Dual Wield | Speed = Swift | Damage type = Sharp | Passives = Powerful Decay | Abilities = Bladestorm | Mk3_Damage_min = 112 | Mk3_Damage_max = 130 | Mk4_Damage_min = 269 | Mk4_Damage_max = 313 | Mk5_Damage_min = 308 | Mk5_Damage_max = 358 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == {{Navbox/Weapons}} 80fd6cf0dc6a59c85d7b761b05ed0b0cb9908c27 Lacerators 0 477 719 718 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Lacerators.png | Type = Dual Wield | Speed = Fast | Damage type = Sharp | Passives = Lacerate, Lifesteal | Mk2_Damage_min = 97 | Mk2_Damage_max = 108 | Mk5_Damage_min = 235 | Mk5_Damage_max = 261 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == {{Navbox/Weapons}} b1946670af3fe4f2bd09c0dfc86872b327a200a9 Daggers 0 478 721 720 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Daggers.png | Type = Dual Wield | Speed = Swift | Damage type = Sharp | Abilities = Dual Brutality, Shadowstep | Mk_min = 2 | Mk2_Damage_min = 106 | Mk2_Damage_max = 123 | Mk3_Damage_min = 135 | Mk3_Damage_max = 157 }} '''{{PAGENAME}}''' are a type of [[dual wield]] [[Weapons|weapon]] in {{BFF}}. == Location == Located together with the [[sentinel]] [[Armor sets|armor set]] on a corpse in [[Asylum|the asylum]]. See [[Sentinel#Location]] for its location. {{Navbox/Weapons}} 564b414d6a096a1107d0569379379434b1e1f48e Khopeshs 0 479 723 722 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Khopeshs.png | Type = Dual Wield | Damage type = Sharp | Speed = Fast | Abilities = Dual Brutality, Bladestorm | Mk0_Damage_min = 92 | Mk0_Damage_max = 102 | Mk1_Damage_min = 104 | Mk1_Damage_max = 115 | Mk2_Damage_min = 115 | Mk2_Damage_max = 128 | Mk3_Damage_min = 139 | Mk3_Damage_max = 154 }} '''{{PAGENAME}}''' are a type of [[Dual Wield]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Nemesis]]. {{Navbox/Weapons}} c8f5f702bd2d22af0adff4ad34825ffb25021210 Blades of Atropos 0 480 725 724 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Blades of Atropos.png | Type = Dual Wield | Damage type = Sharp | Speed = Fast | Passives = Bloodthirst | Abilities = Phase | Mk0_Damage_min = 131 | Mk0_Damage_max = 145 | Mk1_Damage_min = 147 | Mk1_Damage_max = 164 | Mk2_Damage_min = 164 | Mk2_Damage_max = 182 | Mk3_Damage_min = 197 | Mk3_Damage_max = 218 | Mk4_Damage_min = 229 | Mk4_Damage_max = 255 | Mk5_Damage_min = 262 | Mk5_Damage_max = 291 }} '''{{PAGENAME}}''' are a [[Dual Wields|dual wield]] weapon in {{BFF}}. == Location == {{coords|2778|-6115|-1198}} Found in [[Desert Mirage]]. Just down the stairs from the [[Homunculus]]. {{Navbox/Weapons}} 52da0a005c0bcb26cb17a6ee2da89b32c687e4ea Citadel Warrior Chest 0 481 727 726 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | image = Citadel Warrior Chest.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Medium | Set = Citadel Warrior | Mk2_Sharp = 984 | Mk2_Blunt = 1296 | Mk2_Technomancy = 719 }} {{Navbox/Armor}} 2d3a3133daf3387abf5d098ec92e1514330b81d4 Librarian Overcoat 0 482 729 728 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | image = Librarian Overcoat.png | title = {{PAGENAME}} | Type = Chestguard | Set = Librarian | Weight = Light | Mk1_Sharp = 660 | Mk1_Blunt = 744 | Mk1_Technomancy = 1009 }} == Location == Dropped by "Librarian" enemies in [[Deluge|the Deluge]]? {{Navbox/Armor}} ae4dc71e0b3fd31a0a4477632675eea80c6965d8 Corrupted Cuirass 0 483 731 730 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | image = Corrupted Cuirass.png | title = {{PAGENAME}} | Type = Chestguard | Weight = Heavy | Mk2_Sharp = 1728 | Mk2_Blunt = 1488 | Mk2_Technomancy = 174 }} {{Navbox/Armor}} 183dddf62f3fe9d1345ac172c6970d381d73782b Citadel Warrior 0 484 733 732 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor set | image = Citadel Warrior.png | title = {{PAGENAME}} | Weight = Medium | Helmet = Citadel Warrior Helmet | Pauldrons = Citadel Warrior Shoulders | Chestguard = Citadel Warrior Chest | Legguard = Citadel Warrior Legguards | Gauntlets = Citadel Warrior Gauntlets }} '''{{PAGENAME}}''' is an [[armor set]] in {{BFF}}. == Pieces == * [[Citadel Warrior Helmet]] * [[Citadel Warrior Shoulders]] * [[Citadel Warrior Chest]] * [[Citadel Warrior Legguards]] * [[Citadel Warrior Gauntlets]] == See also == * [[Citadel Defender]] &ndash; Heavy variant with higher defense ratings. {{Navbox/Armor}} e1f48b76a2706b1879b8a99de8adffee44fc8785 Sentinel 0 485 735 734 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor set | image = Sentinel.png | title = {{PAGENAME}} | Helmet = Sentinel Helmet | Chestguard = Sentinel Chest | Legguard = Sentinel Legguard | Gauntlets = Sentinel Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] that can be found in {{BFF}}. == Location == {{coords|-3634|1305|9617}} The full set can be found on a corpse in [[Asylum|the Asylum]]. After reaching the top of the small spiral staircase, continue through the long corridor and get to the bottom of the next room. Walk through the doorway and hug the left wall to reach an area behind a wall with a corpse sitting in a corner holding the armor set and the [[Daggers]]. {{Navbox/Armor}} c383d5b5ea00cce79216ed8915d5810d12cb993f Vengeance 0 486 737 736 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor set | title = {{PAGENAME}} | image = Vengeance.png | Helmet = Vengeance Helmet | Chestguard = Vengeance Cuirass | Legguard = Vengeance Legs | Gauntlets = Vengeance Gauntlets }} '''{{PAGENAME}}''' is an [[Armor sets|armor set]] found in {{BFF}}. == Location == {{coords|-3925|1676|9471}} Found on a corpse in the shortcut area leading to the big tower. {{Navbox/Armor}} 37e805d19347a1c48db878ae9dc7e86a5905fb7b Librarian (armor set) 0 487 739 738 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor set | image = Librarian.png | title = Librarian | Weight = Light | Helmet = Librarian Hood | Pauldrons = <!-- Librarian ??? --> | Chestguard = Librarian Overcoat | Legguard = Librarian Trousers | Gauntlets = <!-- Librarian ??? --> }} '''Librarian''' is an [[armor set]] in {{BFF}}. == Pieces == * [[Librarian Hood]] <!-- * [[Librarian ???]] --> * [[Librarian Overcoat]] * [[Librarian Trousers]] <!-- * [[Librarian ???]] --> {{Navbox/Armor}} ad355bf6137087d645f4fbb2ac96e384f57db8a8 Librarian Trousers 0 488 741 740 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | image = Librarian Trousers.png | title = {{PAGENAME}} | Type = Legguard | Weight = Light | Set = Librarian | Mk1_Sharp = 456 | Mk1_Blunt = 516 | Mk1_Technomancy = 696 }} {{Navbox/Armor}} 1d0c2fa9e238497ee92524a75f41846d76113cd8 Crude Helmet 0 489 743 742 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | image = Crude Helmet.png | title = {{PAGENAME}} | Type = Helmet | Weight = Medium | Mk2_Sharp = 516 | Mk2_Blunt = 600 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}. == Location == {{coords|-3538|-6027|5477}} Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item. {{Navbox/Armor}} 4327414a895ebc5fd2ac98909457618e6423b0f3 Skullface Helmet 0 490 745 744 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Skullface Helmet.png | Type = Helmet | Weight = Light | Passives = [[Volatile Illusions]] | Mk5_Sharp = 692 | Mk5_Blunt = 692 | Mk5_Technomancy = 928 }} == Location == {{coords|-4063|1564|1686}} After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet. {{Navbox/Armor}} 06db38be9569d6ea522dedf56d2264708ad17817 Techpriest Helmet 0 491 747 746 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Techpriest Helmet.png | Type = Helmet | Weight = Light | Passives = [[Minor Flux Regen]] | Mk5_Sharp = 722 | Mk5_Blunt = 722 | Mk5_Technomancy = 928 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1272|-8495|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner. {{Navbox/Armor}} a7a7b23c199012fb916ce23130908fb2796a023c Deserts Respirator Helmet 0 492 749 748 2025-08-21T18:35:43Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Deserts Respirator Helmet.png | Type = helmet | Weight = Medium | Mk2_Sharp = 545 | Mk2_Blunt = 633 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1367|6630|-1395}} Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]]. {{Navbox/Armor}} 85a4c5a22cdde742f764acd2e76c15d11d03503d Plagued Revenant Helmet 0 493 751 750 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Plagued Revenant Helmet.png | Type = Helmet | Weight = Medium | Mk5_Sharp = 883 | Mk5_Blunt = 1024 | Mk5_Technomancy = 540 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Armor}} dcf20306f52ebb49a60617476143ab6a73580f6b Librarian Hood 0 494 753 752 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Librarian Hood.png | Type = Helmet | Weight = Light | Set = Librarian | Mk1_Sharp = 371 | Mk1_Blunt = 371 | Mk1_Technomancy = 469 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Acquisition == Drops from [[Librarian (enemy)|librarian]] enemies. {{Navbox/Armor}} 524d688d52e40e59b69ca9f6a46e4f593a6fcdab Eris 0 495 755 754 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Eris.png | Type = Helmet | Weight = Light | Passives = Flux Efficiency | Mk5_Sharp = 730 | Mk5_Blunt = 730 | Mk5_Technomancy = 939 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|2860|-4261|1423}} Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars. {{Navbox/Armor}} 3716b6c0ca03c71f6dc10ebb3357cb49aa6862ef One-handed weapons 0 496 757 756 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[Weapons|weapon]] in {{BFF}} that come in two variants: [[sharp]] and [[blunt]]. == List of one-handed weapons == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, speed=Speed, CONCAT('[[', damageType, ']]')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |where=type='one-handed' |format=table }} {{Navbox/Weapons}} [[Category:One-handed weapons]] db05c537c888c3ecd32676dae4cbd9e3b79033c3 Paladin Mace 0 497 759 758 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | image = Paladin Mace.png | title = {{PAGENAME}} | Type = one-handed | Damage type = Blunt | Speed = Fast | Abilities = Divine Blessing | Mk0_Damage_min = 76 | Mk0_Damage_max = 83 | Mk1_Damage_min = 85 | Mk1_Damage_max = 93 | Mk2_Damage_min = 95 | Mk2_Damage_max = 104 }} '''{{PAGENAME}}''' is a [[One-handed weapons|one-handed]] [[Weapons|weapon]] that can be found in {{BFF}}. == Location == {{coords|-4879|-7530|5578}} In [[Deluge|the Deluge]]. Located in a square hole in the wall inside the first rectangular structure with pillars after crossing a bridge. The [[Items|item]] can be seen straight ahead when crossing the bridge. {{Navbox/Weapons}} 9ae9ef12f0012f7ee76e8b19eb462a731a31721f Scimitar 0 498 761 760 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Scimitar.png | Type = One-handed | Damage type = Sharp | Speed = Swift | Abilities = Whiplash | Mk2_Damage_min = 150 | Mk2_Damage_max = 163 }} '''{{PAGENAME}}''' is a [[One-handed weapons|one-handed weapon]] in {{BFF}}. == Location == {{coords|1713|7517|-1413}} Located inside a building in the [[Desert]], after getting down on the bottom. {{Navbox/Weapons}} 7da5444707df0750219ed6dda415a75ee3b04a8e Nodachi 0 499 763 762 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Nodachi.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Whirlwind, Tornado | Mk3_Damage_min = 315 | Mk3_Damage_max = 344 | Mk4_Damage_min = 368 | Mk4_Damage_max = 402 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Dropped by [[Nurgei the Blademaster]]. {{Navbox/Weapons}} 86417f91f727b87f778da76948fb454da2e92744 Soul Reaper 0 500 765 764 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Soul Reaper.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Reap, Soul Storm | Mk3_Damage_min = 322 | Mk3_Damage_max = 361 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|1413|-9293|190}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. When reaching the outdoors area, head up the stairs and go left. Climb up the cliff by repeatedly tapping the jump button. Once at the top, head forward and follow the path that leads downwards. Eventually you will reach a group of buildings. In front of one of these is the weapon. {{Navbox/Weapons}} 950b71e0fc9d4dbdefdb52a2c58ee43849dd7600 Anastasia 0 501 767 766 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Anastasia.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Reanimate Dead, Silencing Reap | Mk3_Damage_min = 364 | Mk3_Damage_max = 408 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Plagued Revenant]]. {{Navbox/Weapons}} 999c96e5d8b0e959b4174e16951f4d2f08e6598c Crescent Axe 0 502 769 768 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Crescent Axe.png | Type = two-handed | Damage type = Sharp | Speed = Slow | Abilities = Expose Armor, Crescent Slash | Mk2_Damage_min = 251 | Mk2_Damage_max = 271 }} == Location == {{coords|-3932|1535|1532}} Located in the room with [[The Banshee]] [[Data logs|data log]]. 6ae8e711635fe9f28bf31f5f61c2b8a34e8e0452 Royal Claymore 0 503 771 770 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Royal Claymore.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Claymore Swing, Sword Strike | Mk3_Damage_min = 315 | Mk3_Damage_max = 344 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|-9938|7939|-1340}} Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item. {{Navbox/Weapons}} d8f571fe32e600c12e02d6d3d5e06dac9e5df229 Valtiel 0 504 773 772 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Valtiel.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Syphon Life, Carnage | Mk3_Damage_min = 522 | Mk3_Damage_max = 562 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Acquisition == Drops from [[Vermillion Knight|Vermillion Knights]]. {{Navbox/Weapons}} cd2852971f9cc25db419ef806fb9c0960f845d16 Twinblade 0 505 775 774 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Twinblade.png | Type = Twinblade | Damage type = Sharp | Speed = Swift | Abilities = Blade Dance, Blade Flurry | Mk3_Damage_min = 75 | Mk3_Damage_max = 78 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade]] [[Weapons|weapon]] in {{BFF}}. == Acquisition == Drops from [[enemies]] using the twinblade weapon. {{Navbox/Weapons}} f75786b2c8e5d234ef871b2f5c2e32b4924b1b6a Asklepios 0 506 777 776 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Asklepios.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Mending Light, Second Breath | Mk3_Damage_min = 117 | Mk3_Damage_max = 120 }} '''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}. == Acquisition == Dropped by big floating knights with blue lightsabers in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. {{Navbox/Weapons}} 19d3bc07174d18e309f111ea29df123b354aac8e Vermillion Staff 0 507 779 778 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Vermillion Staff.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Forceful Repulsion, Quake | Mk_min = 3 | Mk3_Damage_min = 117 | Mk3_Damage_max = 120 }} '''{{PAGENAME}}''' is a [[Staves|staff]] weapon in {{BFF}}. == Location == {{coords|1241|-8256|275}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. At the outdoor area with a big staircase leading up, head instead to the right before the staircase, leading to an area with some tombstones. The weapon can be found leaning against a wall in the dead-end. {{Navbox/Weapons}} e59fb090f56eced502c56a092f5d2cf9267c2818 Blessed Crosier 0 508 781 780 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Blessed Crosier.png | Type = Staff | Damage type = Technomancy | Speed = Slow | Abilities = Escape Velocity, Energy Burst | Mk3_Damage_min = 173 | Mk3_Damage_max = 177 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. == Acquisition == Dropped by [[Archinquisitor Belisarius (boss)]]. {{Navbox/Weapons}} d1d557ec6a9700fda1ee5579a6f5c4cf86cd912f Arcane Bow 0 509 783 782 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Arcane Bow.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Vermillion Judgment | Abilities = Arrow Twister | Mk2_Damage_min = 184 | Mk2_Damage_max = 197 | Mk3_Damage_min = 251 | Mk3_Damage_max = 267 | Mk4_Damage_min = 292 | Mk4_Damage_max = 312 | Mk5_Damage_min = 334 | Mk5_Damage_max = 356 }} '''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}. == Location == {{coords|1261|-8400|1563}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse. {{Navbox/Weapons}} 9ed7d6da9990d1b86ae941adf6cc8ea5f6b173fb Taskmaster 0 510 785 784 2025-08-21T18:35:44Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Taskmaster.png | Type = Ranged | Damage type = Sharp | Speed = Fast | Passives = Rapid Fire, Critical Strike | Mk2_Damage_min = 240 | Mk2_Damage_max = 256 }} '''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}. == Location == {{coord|4052|1265|-1412}} Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches. {{Navbox/Weapons}} dd37cc2a86e75e6fa9d8f0c27f5bfcb3c3a09e92 Category:Pages declaring Cargo tables 14 511 786 2025-08-21T18:36:35Z Sharparam 284703 Created blank page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Wanderer Cape 0 512 788 787 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Cape | title = {{PAGENAME}} | image = Wanderer Cape.png | Effect1 = -0.5 second delay before stamina starts to regenerate. }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn in {{BFF}}. {{Navbox/Capes}} 1f5137f1dafe59cd4ffe5c3b254751901918d15e Folk Cape 0 513 790 789 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Cape | image = Folk Cape.png | title = {{PAGENAME}} | Effect1 = -20% Technocasting speed | Effect2 = +10% [[Technomancy]] penetration | Effect3 = +50 Max [[flux]] points }} '''{{PAGENAME}}''' is a [[Capes|cape]] that can be worn by the player to gain certain effects. == Location == {{coords|-3979|-2143|5796}} At the top of a broken down tower in [[Deluge|the Deluge]] area, in front of [[Dust Sea|the Dust Sea]] [[Data logs|data log]]. After reaching the first [[homunculus]] of the area, walk up the stairs (past [[The Handler]]) and head left, then continue until you enter the big tower. Climb the tower to the top and you'll find the item on the ground at the top of the last set of stairs. {{Navbox/Capes}} ced1f8221d9ad9bf30775a81e257aa3efb4d12dd Corrupted Cape 0 514 792 791 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Cape | image = Corrupted Cape.png | title = {{PAGENAME}} | Effect1 = +800 [[Sharp]] armor rating. | Effect2 = +800 [[Blunt]] armor rating. | Effect3 = +800 [[Technomancy]] armor rating. }} == Location == Dropped by the bigger knight guys ("Corrupted"?) wearing halberts in [[Deluge]]. {{Navbox/Capes}} 85092d24492b81865456f0c2ec6b4b43f2e6c927 Techpriest Cape 0 515 794 793 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Cape | image = Techpriest Cape | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left. == Trivia == * "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]]. {{Navbox/Capes}} a7524062d33903459d69f5c7ae482dff8f0536c9 Amulet of Arcane Protection 0 516 796 795 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Arcane Protection.png | Passives = [[Techno-Defiance]] | Effect1 = +1500 [[Technomancy]] armor rating. }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|4158|-2902|1459}} Found near the top side of a shortcut ladder in [[Uranopolis]]. {{Navbox/Amulets}} 18efef3d358787360eb91c39568ddbe8822cdf47 Amulet of Evasion 0 517 798 797 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Evasion.png | Passives = [[Extended Evasion]] }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|1251|-8419|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building. {{Navbox/Amulets}} 9e21e16f6b5f152489ca325ce8295f57ce37b702 Tactician's Amulet 0 518 800 799 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Tactician's Amulet.png | Effects = Removes invincibility frames | Passives = Vulnerable Dodge }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. {{Navbox/Amulets}} 8032681e4f4e42a1fa5445d736a503ae40145d42 Ring of Burning Desire 0 519 802 801 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ring | image = Ring of Burning Desire.png | title = {{PAGENAME}} | Effect1 = +20% chance to inflict [[heat]] [[status effect]]. }} '''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}. == Acquisition == Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area. {{Navbox/Rings}} e25c13f86a914c3c38145e3c207d7ca4d045bcf0 Ring of Casting Speed 0 520 804 803 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Casting Speed.png | Effect1 = -10% attack power. | Effect2 = +20% technocasting speed. }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Acquisition == Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}. {{Navbox/Rings}} 46f3eb13e5516b422e23a89fb5ec0e0a924ed783 Ring of Rammstein 0 521 806 805 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Rammstein.png | Passives = [[Momentum Strike]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{main|Tech Shield#Location}} This item is located on the same corpse as the [[Tech Shield]]. {{Navbox/Rings}} 1bf2ae52125b19a63277c4ea076e1cf3f2107e6e Ring of Exceeding Talent 0 522 808 807 2025-08-21T18:40:01Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Exceeding Talent.png | Effect1 = +3 [[Strength]] | Effect2 = +3 [[Agility]] | Effect3 = +3 [[Constitution]] | Effect4 = +3 [[Intelligence]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{coords|3720|1159|-1397}} Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]). == See also == * [[Ring of Lesser Talent]] – The weakest version of this ring. * [[Ring of Talent]] – A weaker version of this ring. {{Navbox/Rings}} bcbe61aaf34441d0c94fadf4e2d02dbe42c66205 Category:Rings 14 523 809 2025-08-21T18:40:49Z Sharparam 284703 Created page with "[[Rings]] in {{BFF}}. [[Category:Equipment]]" wikitext text/x-wiki [[Rings]] in {{BFF}}. [[Category:Equipment]] 6be38d49249074ddfca4ec380e09f5762403fd47 Category:Equipment 14 524 810 2025-08-21T18:41:11Z Sharparam 284703 Created page with "[[Equipment]] in {{BFF}}. [[Category:Items]]" wikitext text/x-wiki [[Equipment]] in {{BFF}}. [[Category:Items]] 15110e4ea1647cf4d9e255a1263386500041dfd3 Category:Pages using invalid arguments in ParserPower functions 14 525 811 2025-08-21T18:43:02Z Sharparam 284703 Created page with "__HIDDENCAT__ __EXPECTUNUSEDCATEGORY__" wikitext text/x-wiki __HIDDENCAT__ __EXPECTUNUSEDCATEGORY__ 7e6b7092e497df1715b699132e1d441f8d47d5ff Sharp 0 526 813 812 2025-08-21T18:43:57Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Sharp''' is a type of damage in {{BFF}}. 791f7c953da43e2ac6ebe338f36d863e32d3ac49 Template:Average/doc 10 532 824 2025-08-21T18:48:54Z Sharparam 284703 Remove unused doc templates wikitext text/x-wiki This template is used to find the average (default mean) of a series of numbers. ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}} ==See also== *{{tl|Median}} 9ec70adff5359cd4d4afdfa0d6d5d8f24974fc11 825 824 2025-08-21T18:49:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki This template is used to find the average (default mean) of a series of numbers. ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}} ==See also== *{{tl|Median}} 9ec70adff5359cd4d4afdfa0d6d5d8f24974fc11 Template:DamageRange 10 527 815 814 2025-08-21T18:49:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{Tooltip|{{{1}}}&ndash;{{{2}}}|Average: {{Average|{{{1}}}|{{{2}}}}}}}{{#if:{{{type|}}}|&nbsp;{{#switch:{{lc:{{{type}}}}} | sharp = [[Sharp]] | blunt = [[Blunt]] | tech | technomancy = [[Technomancy]] | #default = {{{type}}} }}|}}</includeonly><noinclude>{{Documentation}}</noinclude> bee05e8ca021e7585fc203ed68db91f82ab057e2 Template:DamageRange/doc 10 528 817 816 2025-08-21T18:49:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> &rarr; {{DamageRange|10|20}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> &rarr; {{DamageRange|1|2}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> &rarr; {{DamageRange|69|75|type=sharp}} a5a6c8376c27ec92e876a4bf84571a621dfedbac Template:Tooltip 10 529 819 818 2025-08-21T18:49:41Z Sharparam 284703 1 revision imported wikitext text/x-wiki <templatestyles src="Template:Tooltip/styles.css" /><includeonly><span class="tooltip tooltip-dotted" title="{{#replace:{{{2}}}|"|&quot;}}">{{{1}}}</span></includeonly><noinclude> {{Documentation|Template:Abbr/doc}} </noinclude> 02939f9a947fe3904add1355d50d42b05211f8b9 Template:Tooltip/styles.css 10 530 821 820 2025-08-21T18:49:42Z Sharparam 284703 1 revision imported sanitized-css text/css .tooltip-dotted { border-bottom: 1px dotted; } .tooltip-help { cursor: help; } af2f58c266b5958cf73537f523615e9783db80ff Template:Average 10 531 823 822 2025-08-21T18:49:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#if:{{{round|}}}|{{formatnum:{{round|{{#invoke:math|average}}|{{{round|}}}}}|R}}|{{#invoke:math|average}}}}</includeonly><noinclude>{{doc}}</noinclude> b37093608b62a3faf722c64135fc79c4498e3d5b Template:Abbr/doc 10 533 827 826 2025-08-21T18:49:42Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Examples == === [[Template:Tooltip]] === * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> &rarr; {{Tooltip|text|tooltip title}} * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> &rarr; {{Tooltip|text "with" quotes|tooltip "with" quotes}} 7e8e0dc4e38c09167b11915c2ddced76bbfe4ae4 Module:Math 828 534 829 828 2025-08-21T18:49:42Z Sharparam 284703 1 revision imported Scribunto text/plain --[[ This module provides a number of basic mathematical operations. ]] local yesno, getArgs -- lazily initialized local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules. local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua. --[[ Helper functions used to avoid redundant code. ]] local function err(msg) -- Generates wikitext error messages. return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg) end local function unpackNumberArgs(args) -- Returns an unpacked list of arguments specified with numerical keys. local ret = {} for k, v in pairs(args) do if type(k) == 'number' then table.insert(ret, v) end end return unpack(ret) end local function makeArgArray(...) -- Makes an array of arguments from a list of arguments that might include nils. local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs. local nums = {} -- Stores the numbers of valid numerical arguments. local ret = {} for k, v in pairs(args) do v = p._cleanNumber(v) if v then nums[#nums + 1] = k args[k] = v end end table.sort(nums) for i, num in ipairs(nums) do ret[#ret + 1] = args[num] end return ret end local function fold(func, ...) -- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters, -- and must return a number as an output. This number is then supplied as input to the next function call. local vals = makeArgArray(...) local count = #vals -- The number of valid arguments if count == 0 then return -- Exit if we have no valid args, otherwise removing the first arg would cause an error. nil, 0 end local ret = table.remove(vals, 1) for _, val in ipairs(vals) do ret = func(ret, val) end return ret, count end --[[ Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value). ]] local function binary_fold(func, ...) local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...) return value end --[[ random Generate a random number Usage: {{#invoke: Math | random }} {{#invoke: Math | random | maximum value }} {{#invoke: Math | random | minimum value | maximum value }} ]] function wrap.random(args) local first = p._cleanNumber(args[1]) local second = p._cleanNumber(args[2]) return p._random(first, second) end function p._random(first, second) math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000)) -- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params. if first and second then if first <= second then -- math.random doesn't allow the first number to be greater than the second. return math.random(first, second) end elseif first then return math.random(first) else return math.random() end end --[[ order Determine order of magnitude of a number Usage: {{#invoke: Math | order | value }} ]] function wrap.order(args) local input_string = (args[1] or args.x or '0'); local input_number = p._cleanNumber(input_string); if input_number == nil then return err('order of magnitude input appears non-numeric') else return p._order(input_number) end end function p._order(x) if x == 0 then return 0 end return math.floor(math.log10(math.abs(x))) end --[[ precision Detemines the precision of a number using the string representation Usage: {{ #invoke: Math | precision | value }} ]] function wrap.precision(args) local input_string = (args[1] or args.x or '0'); local trap_fraction = args.check_fraction; local input_number; if not yesno then yesno = require('Module:Yesno') end if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]]. local pos = string.find(input_string, '/', 1, true); if pos ~= nil then if string.find(input_string, '/', pos + 1, true) == nil then local denominator = string.sub(input_string, pos+1, -1); local denom_value = tonumber(denominator); if denom_value ~= nil then return math.log10(denom_value); end end end end input_number, input_string = p._cleanNumber(input_string); if input_string == nil then return err('precision input appears non-numeric') else return p._precision(input_string) end end function p._precision(x) if type(x) == 'number' then x = tostring(x) end x = string.upper(x) local decimal = x:find('%.') local exponent_pos = x:find('E') local result = 0; if exponent_pos ~= nil then local exponent = string.sub(x, exponent_pos + 1) x = string.sub(x, 1, exponent_pos - 1) result = result - tonumber(exponent) end if decimal ~= nil then result = result + string.len(x) - decimal return result end local pos = string.len(x); while x:byte(pos) == string.byte('0') do pos = pos - 1 result = result - 1 if pos <= 0 then return 0 end end return result end --[[ max Finds the maximum argument Usage: {{#invoke:Math| max | value1 | value2 | ... }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.max(args) return p._max(unpackNumberArgs(args)) end function p._max(...) local max_value = binary_fold((function(a, b) return a > b end), ...) if max_value then return max_value end end --[[ median Find the median of set of numbers Usage: {{#invoke:Math | median | number1 | number2 | ...}} OR {{#invoke:Math | median }} ]] function wrap.median(args) return p._median(unpackNumberArgs(args)) end function p._median(...) local vals = makeArgArray(...) local count = #vals table.sort(vals) if count == 0 then return 0 end if p._mod(count, 2) == 0 then return (vals[count/2] + vals[count/2+1])/2 else return vals[math.ceil(count/2)] end end --[[ min Finds the minimum argument Usage: {{#invoke:Math| min | value1 | value2 | ... }} OR {{#invoke:Math| min }} When used with no arguments, it takes its input from the parent frame. Note, any values that do not evaluate to numbers are ignored. ]] function wrap.min(args) return p._min(unpackNumberArgs(args)) end function p._min(...) local min_value = binary_fold((function(a, b) return a < b end), ...) if min_value then return min_value end end --[[ sum Finds the sum Usage: {{#invoke:Math| sum | value1 | value2 | ... }} OR {{#invoke:Math| sum }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.sum(args) return p._sum(unpackNumberArgs(args)) end function p._sum(...) local sums, count = fold((function(a, b) return a + b end), ...) if not sums then return 0 else return sums end end --[[ average Finds the average Usage: {{#invoke:Math| average | value1 | value2 | ... }} OR {{#invoke:Math| average }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.average(args) return p._average(unpackNumberArgs(args)) end function p._average(...) local sum, count = fold((function(a, b) return a + b end), ...) if not sum then return 0 else return sum / count end end --[[ round Rounds a number to specified precision Usage: {{#invoke:Math | round | value | precision }} --]] function wrap.round(args) local value = p._cleanNumber(args[1] or args.value or 0) local precision = p._cleanNumber(args[2] or args.precision or 0) if value == nil or precision == nil then return err('round input appears non-numeric') else return p._round(value, precision) end end function p._round(value, precision) local rescale = math.pow(10, precision or 0); return math.floor(value * rescale + 0.5) / rescale; end --[[ log10 returns the log (base 10) of a number Usage: {{#invoke:Math | log10 | x }} ]] function wrap.log10(args) return math.log10(args[1]) end --[[ mod Implements the modulo operator Usage: {{#invoke:Math | mod | x | y }} --]] function wrap.mod(args) local x = p._cleanNumber(args[1]) local y = p._cleanNumber(args[2]) if not x then return err('first argument to mod appears non-numeric') elseif not y then return err('second argument to mod appears non-numeric') else return p._mod(x, y) end end function p._mod(x, y) local ret = x % y if not (0 <= ret and ret < y) then ret = 0 end return ret end --[[ gcd Calculates the greatest common divisor of multiple numbers Usage: {{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }} --]] function wrap.gcd(args) return p._gcd(unpackNumberArgs(args)) end function p._gcd(...) local function findGcd(a, b) local r = b local oldr = a while r ~= 0 do local quotient = math.floor(oldr / r) oldr, r = r, oldr - quotient * r end if oldr < 0 then oldr = oldr * -1 end return oldr end local result, count = fold(findGcd, ...) return result end --[[ precision_format Rounds a number to the specified precision and formats according to rules originally used for {{template:Rnd}}. Output is a string. Usage: {{#invoke: Math | precision_format | number | precision }} ]] function wrap.precision_format(args) local value_string = args[1] or 0 local precision = args[2] or 0 return p._precision_format(value_string, precision) end function p._precision_format(value_string, precision) -- For access to Mediawiki built-in formatter. local lang = mw.getContentLanguage(); local value value, value_string = p._cleanNumber(value_string) precision = p._cleanNumber(precision) -- Check for non-numeric input if value == nil or precision == nil then return err('invalid input when rounding') end local current_precision = p._precision(value) local order = p._order(value) -- Due to round-off effects it is neccesary to limit the returned precision under -- some circumstances because the terminal digits will be inaccurately reported. if order + precision >= 14 then if order + p._precision(value_string) >= 14 then precision = 13 - order; end end -- If rounding off, truncate extra digits if precision < current_precision then value = p._round(value, precision) current_precision = p._precision(value) end local formatted_num = lang:formatNum(math.abs(value)) local sign -- Use proper unary minus sign rather than ASCII default if value < 0 then sign = '−' else sign = '' end -- Handle cases requiring scientific notation if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) >= 9 then value = value * math.pow(10, -order) current_precision = current_precision + order precision = precision + order formatted_num = lang:formatNum(math.abs(value)) else order = 0; end formatted_num = sign .. formatted_num -- Pad with zeros, if needed if current_precision < precision then local padding if current_precision <= 0 then if precision > 0 then local zero_sep = lang:formatNum(1.1) formatted_num = formatted_num .. zero_sep:sub(2,2) padding = precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end else padding = precision - current_precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end end -- Add exponential notation, if necessary. if order ~= 0 then -- Use proper unary minus sign rather than ASCII default if order < 0 then order = '−' .. lang:formatNum(math.abs(order)) else order = lang:formatNum(order) end formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>' end return formatted_num end --[[ divide Implements the division operator Usage: {{#invoke:Math | divide | x | y | round= | precision= }} --]] function wrap.divide(args) local x = args[1] local y = args[2] local round = args.round local precision = args.precision if not yesno then yesno = require('Module:Yesno') end return p._divide(x, y, yesno(round), precision) end function p._divide(x, y, round, precision) if y == nil or y == "" then return err("Empty divisor") elseif not tonumber(y) then if type(y) == 'string' and string.sub(y, 1, 1) == '<' then return y else return err("Not a number: " .. y) end elseif x == nil or x == "" then return err("Empty dividend") elseif not tonumber(x) then if type(x) == 'string' and string.sub(x, 1, 1) == '<' then return x else return err("Not a number: " .. x) end else local z = x / y if round then return p._round(z, 0) elseif precision then return p._round(z, precision) else return z end end end --[[ Helper function that interprets the input numerically. If the input does not appear to be a number, attempts evaluating it as a parser functions expression. ]] function p._cleanNumber(number_string) if type(number_string) == 'number' then -- We were passed a number, so we don't need to do any processing. return number_string, tostring(number_string) elseif type(number_string) ~= 'string' or not number_string:find('%S') then -- We were passed a non-string or a blank string, so exit. return nil, nil; end -- Attempt basic conversion local number = tonumber(number_string) -- If failed, attempt to evaluate input as an expression if number == nil then local success, result = pcall(mw.ext.ParserFunctions.expr, number_string) if success then number = tonumber(result) number_string = tostring(number) else number = nil number_string = nil end else number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it. number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs. if number_string:find('^%-?0[xX]') then -- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead. number_string = tostring(number) end end return number, number_string end --[[ Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments. ]] local mt = { __index = function(t, k) return function(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return wrap[k](getArgs(frame)) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed. end end } return setmetatable(p, mt) 2bbe734d898299f65412963a3c1782e9fcc4d9ca Template:Plainlist 10 535 831 830 2025-08-21T18:51:17Z Sharparam 284703 1 revision imported wikitext text/x-wiki <templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude> 1f83cec6d8a2e5ba45342d554089a71b19afae80 Template:Plainlist/styles.css 10 536 833 832 2025-08-21T18:51:17Z Sharparam 284703 1 revision imported sanitized-css text/css .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 15a09febff47c3fa7ff01092a7cd381b44a14427 Template:Navbox/Enemies 10 538 836 2025-08-21T18:53:26Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox | template = Navbox/Enemies | title = [[Enemies]] | list1 = * [[Berserking Citizen]] * [[Citizen]] * [[Construction Golem]] * [[Deranged]] * [[Dreadguard]] * [[Fisherman]] * [[Lancer]] * [[Mechanomad Technomancer]] * [[Mechanomad Warrior]] * [[Minotaur]] * [[Mrgud]] * [[Osteoclast]] * [[Plagued]] * [[Revenant]] * [[Vermillion Knight]] * [[Zealot]] | group2 = [[Bosses]] | list2 = {{Navbox/Bosses|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 24cfff4a2c251e67dc47c1f176a54be03c2b71a5 837 836 2025-08-21T18:54:09Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox | template = Navbox/Enemies | title = [[Enemies]] | list1 = * [[Berserking Citizen]] * [[Citizen]] * [[Construction Golem]] * [[Deranged]] * [[Dreadguard]] * [[Fisherman]] * [[Lancer]] * [[Mechanomad Technomancer]] * [[Mechanomad Warrior]] * [[Minotaur]] * [[Mrgud]] * [[Osteoclast]] * [[Plagued]] * [[Revenant]] * [[Vermillion Knight]] * [[Zealot]] | group2 = [[Bosses]] | list2 = {{Navbox/Bosses|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 24cfff4a2c251e67dc47c1f176a54be03c2b71a5 Enemies 0 537 835 834 2025-08-21T18:54:09Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Navbox/Enemies}} 833889e0d1b529dbf02a0a7b4ded350913eaaadd Bosses 0 539 839 838 2025-08-21T18:54:09Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated. {{Navbox/Bosses}} 0c3e8dc2475799e24d9fb25b0d80bf435d40e02a Category:Bosses 14 540 841 840 2025-08-21T18:54:09Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Enemies]] d3da306a1b523dea15853a2b661da0200bf2f201 868 841 2025-08-21T18:56:28Z Sharparam 284703 Add description wikitext text/x-wiki [[Bosses]] in {{BFF}}. [[Category:Enemies]] f6372fb3755dcaa25f58460244200cff259ffce0 Fisherman 0 541 843 842 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location. == Drops == * [[Diver's Lungs Concoction]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Lesser Anomalous Crystal]] * [[Lesser Restorative Fluid]] * [[Ring of Burning Desire]] * [[Sludge]] * [[Upgrade Splinter]] [[Category:Enemies]] 854a2903c300d816cf3a65b85c7bee9c7c9aeb6e Plagued Nemesis 0 542 845 844 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | image = Plagued Nemesis.png | SharpResist = 32 | BluntResist = 2 | TechnomancyResist = 50 }} '''{{PAGENAME}}''' is an optional [[boss]] [[Enemies|enemy]] in {{BFF}}. == Location == Found at the top of the big tower in [[Asylum|the asylum]]. == Drops == * [[Khopeshs]] * [[Unstable Perk Essence]] * [[Upgrade Module]] * [[Anomalous Fragment]] (Only in [[NG+]]) {{Navbox/Bosses}} 3ab22950bbea5ef8c5c7eecf9db701cacb0006a0 Silicon Visage 0 543 847 846 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | image = Silicon Visage.png | SharpResist = 15 | BluntResist = 16 | TechnomancyResist = 55 }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|9307|2902|1628}} (approximate) Located in [[Upper Blocks]]. == Drops == * [[Upgrade Module]] * [[Unstable Perk Essence]] {{Navbox/Bosses}} 773d7fa0e470181a1ad1ada63a49044d0679caf7 Nurgei the Blademaster 0 544 849 848 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Nurgei the Blademaster.png | SharpResist = 29 | BluntResist = 37 | TechnomancyResist = 57 }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] [[Enemies|enemy]] in {{BFF}}. == Location == {{coords|1138|-9288|1571}} (approximate) Found in [[Uranopolis#Lone Tower|Uranopolis (Lone Tower)]]. From the [[Homunculus]], walk across the long bridge lined with pillars and you will see him straight ahead in his boss arena. == Drops == * [[Upgrade Module]] * [[Nodachi]] * [[Unstable Perk Essence]] * [[Anomalous Fragment]] ([[NG+]]) {{Navbox/Bosses}} 1f8634a99af6d189e90d0e6283c284736ffbd4fe Plagued Warden 0 545 851 850 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Plagued Warden.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|2395|-2410|529}} (approximate) Located in [[Blok 6147]]. After getting off the [[subway]], take the path leading up and then take the stairs on the left. You will see a platform nearby with a spiked shield on the far end. Interacting with the shield spawns the boss, but doing so requires having the [[Plagued Blood]] item in your inventory. == Drops == * [[Spiked Shield]] (only in NG (or if you don't yet have it?)) * [[Anomalous Fragment]] (only in [[NG+]] (or if you don't have the shield?)) {{Navbox/Bosses}} 5dfd44f48ae568136e010129ccbd00bbd7c71a55 Plagued Revenant 0 546 853 852 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Plagued Revenant.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|1432|-8866|199}} (approximate) Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After getting to the outdoors area, keep going straight until you get to the end, take a right and then left to get down to a cliff area. Go left and you'll see a mausoleum inside the cliff on the left with some graves in front of it. In front of the doors of this mausoleum is a helmet ({{coords|1409|-8884|190}}). Interacting with the helmet to attempt to take it will spawn the boss behind you. == Drops == * [[Anastasia]] * [[Plagued Revenant Helmet]] == Trivia == * When dying to this boss, crying can be heard during the loading screen. This could either be intentional or a result of the nearby crying enemy respawning. {{Navbox/Bosses}} 698530510328c2e5031366f6586a3eb9494a65e4 Wormlord 0 547 855 854 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Wormlord.png }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Overview == Defeating Wormlord is required to be able to access [[The Anomaly]]. == Location == {{coords|2550|-4122|-1198}} (approximate) Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} aedb9551379ee1f1febb972b361a1b8ee9e1c3fd Archinquisitor Belisarius (boss) 0 548 857 856 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}} {{Infobox/Boss | title = Archinquisitor Belisarius | image = Archinquisitor Belisarius (boss).png }} '''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|4315|1734|-1413}} (approximate) Found at the beginning of the [[Anomaly]] area. == Drops == * [[Blessed Crosier]] * [[Unstable Perk Essence]] * [[Upgrade Module]] == Quotes == === Upon engaging him === {{Quote |Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now. Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for. The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance. Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend. Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will. Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs. }} {{Navbox/Bosses}} 73a24d629934b27f74f10c58c9ab9e02ed3858bc Unknown (boss) 0 549 859 858 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}} {{Infobox/Boss | title = Unknown | image = Unknown (boss).png }} '''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat. Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]]. == Location == Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 08cbc1e8f1d754f6cc8e5e04d59cc388bc187d8f Konrad the Traitor 0 550 861 860 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Konrad the Traitor.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The boss is not mandatory for progression, as the [[Old Key]] can be looted off the ground behind him. However, skipping him means not having access to [[Homunculus Mirage]], as the husk drops from him (including in [[NG+]]). == Location == {{coords|18794.39|-40662.96|-15.20}} (approximate) Located at the top of the [[Monastery]], being the area's boss. == Drops == * [[Homunculus Mirage Husk]] * [[Handler Echo]] * [[Anomalous Fragment]] ([[NG+]]) {{Navbox/Bosses}} acd47fd792b54614f8d3d42a80fe9037a65997cc Royal Division Captain Yulia & Vermillion Mirage 0 551 863 862 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | image = Final boss.png }} '''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}. == Overview == When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar. After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them. Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death. Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player. Defeating the boss will immediately trigger the [[Endings|ending]] cutscene. After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game. == Location == Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top. {{Navbox/Bosses}} [[Category:Pages that need coordinates]] dfff03fcfd660a270e379514af4cb192c6e3d589 Mutated Ghoul 0 552 865 864 2025-08-21T18:54:10Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Boss | image = Mutated Ghoul.png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Location == {{coords|6937.36|-64861.39|-17736.47}} (approximate) Located in a big grass field at the bottom of the [[Monastery]]. == Drops == * [[Anomalous Fragment]] (only in [[NG+]]) {{Navbox/Bosses}} 8e88bd012af5d51d364d79af5fc33127dd67fa4d Template:Navbox/Bosses 10 553 866 2025-08-21T18:55:01Z Sharparam 284703 Created page with "<!-- List bosses in alphabetical order -->{{Navbox | {{{1|}}} | template = Navbox/Bosses | title = [[Bosses]] | list1 = * [[Aberrant Knight]] * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] * [[Konrad the Traitor]] * [[Mutated Ghoul]] * [[Nurgei the Blademaster]] * [[Plagued Nemesis]] * [[Plagued Revenant]] * [[Plagued Warden]] * [[Royal Division Captain Yulia & Vermillion Mirage]] * [[Silicon Visage]] * [[Unknown (boss)|Unknown]] * [[Wormlord]] }}<noinc..." wikitext text/x-wiki <!-- List bosses in alphabetical order -->{{Navbox | {{{1|}}} | template = Navbox/Bosses | title = [[Bosses]] | list1 = * [[Aberrant Knight]] * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] * [[Konrad the Traitor]] * [[Mutated Ghoul]] * [[Nurgei the Blademaster]] * [[Plagued Nemesis]] * [[Plagued Revenant]] * [[Plagued Warden]] * [[Royal Division Captain Yulia & Vermillion Mirage]] * [[Silicon Visage]] * [[Unknown (boss)|Unknown]] * [[Wormlord]] }}<noinclude>[[Category:Navigation templates]]</noinclude> e281c4190fb60fa20447ad931105d10e630d08b7 Bosses 0 539 867 839 2025-08-21T18:55:55Z Sharparam 284703 Add category wikitext text/x-wiki '''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated. {{Navbox/Bosses}} [[Category:Bosses]] bb7b42c9d701b6e1db772a7bcd242b850128fe27 Category:Enemies 14 554 869 2025-08-21T18:57:13Z Sharparam 284703 Created page with "[[Enemies]] in {{BFF}}." wikitext text/x-wiki [[Enemies]] in {{BFF}}. 112bd8e00bed6ea82522cac44012b082f89bb6d9 Enemies 0 537 870 835 2025-08-21T18:58:04Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox/Enemies}} [[Category:Enemies]] d6faf8074e8ca5dfe61e1d61bd2b3e81348c1ba8 Category:Capes 14 555 871 2025-08-21T19:55:58Z Sharparam 284703 Created page with "[[Capes]] in {{BFF}}. [[Category:Equipment]]" wikitext text/x-wiki [[Capes]] in {{BFF}}. [[Category:Equipment]] 610b5d39e64ba2027967f7f378bcd46fa727934f Module:String 828 556 872 2025-08-21T20:01:02Z Sharparam 284703 Created page with "--[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error c..." Scribunto text/plain --[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error condition will result in an empty string being returned rather than an error message. error_category: If an error occurs, specifies the name of a category to include with the error message. The default category is [Category:Errors reported by Module String]. no_category: If set to 'true' or 1, no category will be added if an error is generated. Unit tests for this module are available at Module:String/tests. ]] local str = {} --[[ len This function returns the length of the target string. Usage: {{#invoke:String|len|target_string|}} OR {{#invoke:String|len|s=target_string}} Parameters s: The string whose length to report If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the target string. ]] function str.len( frame ) local new_args = str._getParameters( frame.args, {'s'} ) local s = new_args['s'] or '' return mw.ustring.len( s ) end --[[ sub This function returns a substring of the target string at specified indices. Usage: {{#invoke:String|sub|target_string|start_index|end_index}} OR {{#invoke:String|sub|s=target_string|i=start_index|j=end_index}} Parameters s: The string to return a subset of i: The first index of the substring to return, defaults to 1. j: The last index of the string to return, defaults to the last character. The first character of the string is assigned an index of 1. If either i or j is a negative value, it is interpreted the same as selecting a character by counting from the end of the string. Hence, a value of -1 is the same as selecting the last character of the string. If the requested indices are out of range for the given string, an error is reported. ]] function str.sub( frame ) local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } ) local s = new_args['s'] or '' local i = tonumber( new_args['i'] ) or 1 local j = tonumber( new_args['j'] ) or -1 local len = mw.ustring.len( s ) -- Convert negatives for range checking if i < 0 then i = len + i + 1 end if j < 0 then j = len + j + 1 end if i > len or j > len or i < 1 or j < 1 then return str._error( 'String subset index out of range' ) end if j < i then return str._error( 'String subset indices out of order' ) end return mw.ustring.sub( s, i, j ) end --[[ This function implements that features of {{str sub old}} and is kept in order to maintain these older templates. ]] function str.sublength( frame ) local i = tonumber( frame.args.i ) or 0 local len = tonumber( frame.args.len ) return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) ) end --[[ _match This function returns a substring from the source string that matches a specified pattern. It is exported for use in other modules Usage: strmatch = require("Module:String")._match sresult = strmatch( s, pattern, start, match, plain, nomatch ) Parameters s: The string to search pattern: The pattern or string to find within the string start: The index within the source string to start the search. The first character of the string has index 1. Defaults to 1. match: In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1. plain: A flag indicating that the pattern should be understood as plain text. Defaults to false. nomatch: If no match is found, output the "nomatch" value rather than an error. For information on constructing Lua patterns, a form of [regular expression], see: * http://www.lua.org/manual/5.1/manual.html#5.4.1 * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns ]] -- This sub-routine is exported for use in other modules function str._match( s, pattern, start, match_index, plain_flag, nomatch ) if s == '' then return str._error( 'Target string is empty' ) end if pattern == '' then return str._error( 'Pattern string is empty' ) end start = tonumber(start) or 1 if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then return str._error( 'Requested start is out of range' ) end if match_index == 0 then return str._error( 'Match index is out of range' ) end if plain_flag then pattern = str._escapePattern( pattern ) end local result if match_index == 1 then -- Find first match is simple case result = mw.ustring.match( s, pattern, start ) else if start > 1 then s = mw.ustring.sub( s, start ) end local iterator = mw.ustring.gmatch(s, pattern) if match_index > 0 then -- Forward search for w in iterator do match_index = match_index - 1 if match_index == 0 then result = w break end end else -- Reverse search local result_table = {} local count = 1 for w in iterator do result_table[count] = w count = count + 1 end result = result_table[ count + match_index ] end end if result == nil then if nomatch == nil then return str._error( 'Match not found' ) else return nomatch end else return result end end --[[ match This function returns a substring from the source string that matches a specified pattern. Usage: {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}} OR {{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index |match=match_number|plain=plain_flag|nomatch=nomatch_output}} Parameters s: The string to search pattern: The pattern or string to find within the string start: The index within the source string to start the search. The first character of the string has index 1. Defaults to 1. match: In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1. plain: A flag indicating that the pattern should be understood as plain text. Defaults to false. nomatch: If no match is found, output the "nomatch" value rather than an error. If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from each string. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. If the match_number or start_index are out of range for the string being queried, then this function generates an error. An error is also generated if no match is found. If one adds the parameter ignore_errors=true, then the error will be suppressed and an empty string will be returned on any failure. For information on constructing Lua patterns, a form of [regular expression], see: * http://www.lua.org/manual/5.1/manual.html#5.4.1 * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns ]] -- This is the entry point for #invoke:String|match function str.match( frame ) local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} ) local s = new_args['s'] or '' local start = tonumber( new_args['start'] ) or 1 local plain_flag = str._getBoolean( new_args['plain'] or false ) local pattern = new_args['pattern'] or '' local match_index = math.floor( tonumber(new_args['match']) or 1 ) local nomatch = new_args['nomatch'] return str._match( s, pattern, start, match_index, plain_flag, nomatch ) end --[[ pos This function returns a single character from the target string at position pos. Usage: {{#invoke:String|pos|target_string|index_value}} OR {{#invoke:String|pos|target=target_string|pos=index_value}} Parameters target: The string to search pos: The index for the character to return If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the target string. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. The first character has an index value of 1. If one requests a negative value, this function will select a character by counting backwards from the end of the string. In other words pos = -1 is the same as asking for the last character. A requested value of zero, or a value greater than the length of the string returns an error. ]] function str.pos( frame ) local new_args = str._getParameters( frame.args, {'target', 'pos'} ) local target_str = new_args['target'] or '' local pos = tonumber( new_args['pos'] ) or 0 if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then return str._error( 'String index out of range' ) end return mw.ustring.sub( target_str, pos, pos ) end --[[ str_find This function duplicates the behavior of {{str_find}}, including all of its quirks. This is provided in order to support existing templates, but is NOT RECOMMENDED for new code and templates. New code is recommended to use the "find" function instead. Returns the first index in "source" that is a match to "target". Indexing is 1-based, and the function returns -1 if the "target" string is not present in "source". Important Note: If the "target" string is empty / missing, this function returns a value of "1", which is generally unexpected behavior, and must be accounted for separatetly. ]] function str.str_find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target'} ) local source_str = new_args['source'] or '' local target_str = new_args['target'] or '' if target_str == '' then return 1 end local start = mw.ustring.find( source_str, target_str, 1, true ) if start == nil then start = -1 end return start end --[[ find This function allows one to search for a target string or pattern within another string. Usage: {{#invoke:String|find|source_str|target_string|start_index|plain_flag}} OR {{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}} Parameters source: The string to search target: The string or pattern to find within source start: The index within the source string to start the search, defaults to 1 plain: Boolean flag indicating that target should be understood as plain text and not as a Lua style regular expression, defaults to true If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. This function returns the first index >= "start" where "target" can be found within "source". Indices are 1-based. If "target" is not found, then this function returns 0. If either "source" or "target" are missing / empty, this function also returns 0. This function should be safe for UTF-8 strings. ]] function str.find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ) local source_str = new_args['source'] or '' local pattern = new_args['target'] or '' local start_pos = tonumber(new_args['start']) or 1 local plain = new_args['plain'] or true if source_str == '' or pattern == '' then return 0 end plain = str._getBoolean( plain ) local start = mw.ustring.find( source_str, pattern, start_pos, plain ) if start == nil then start = 0 end return start end --[[ replace This function allows one to replace a target string or pattern within another string. Usage: {{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}} OR {{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string| count=replacement_count|plain=plain_flag}} Parameters source: The string to search pattern: The string or pattern to find within source replace: The replacement text count: The number of occurences to replace, defaults to all. plain: Boolean flag indicating that pattern should be understood as plain text and not as a Lua style regular expression, defaults to true ]] function str.replace( frame ) local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } ) local source_str = new_args['source'] or '' local pattern = new_args['pattern'] or '' local replace = new_args['replace'] or '' local count = tonumber( new_args['count'] ) local plain = new_args['plain'] or true if source_str == '' or pattern == '' then return source_str end plain = str._getBoolean( plain ) if plain then pattern = str._escapePattern( pattern ) replace = string.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences. end local result if count ~= nil then result = mw.ustring.gsub( source_str, pattern, replace, count ) else result = mw.ustring.gsub( source_str, pattern, replace ) end return result end --[[ simple function to pipe string.rep to templates. ]] function str.rep( frame ) local repetitions = tonumber( frame.args[2] ) if not repetitions then return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' ) end return string.rep( frame.args[1] or '', repetitions ) end --[[ escapePattern This function escapes special characters from a Lua string pattern. See [1] for details on how patterns work. [1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns Usage: {{#invoke:String|escapePattern|pattern_string}} Parameters pattern_string: The pattern string to escape. ]] function str.escapePattern( frame ) local pattern_str = frame.args[1] if not pattern_str then return str._error( 'No pattern string specified' ) end local result = str._escapePattern( pattern_str ) return result end --[[ count This function counts the number of occurrences of one string in another. ]] function str.count(frame) local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'}) local source = args.source or '' local pattern = args.pattern or '' local plain = str._getBoolean(args.plain or true) if plain then pattern = str._escapePattern(pattern) end local _, count = mw.ustring.gsub(source, pattern, '') return count end --[[ endswith This function determines whether a string ends with another string. ]] function str.endswith(frame) local args = str._getParameters(frame.args, {'source', 'pattern'}) local source = args.source or '' local pattern = args.pattern or '' if pattern == '' then -- All strings end with the empty string. return "yes" end if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then return "yes" else return "" end end --[[ join Join all non empty arguments together; the first argument is the separator. Usage: {{#invoke:String|join|sep|one|two|three}} ]] function str.join(frame) local args = {} local sep for _, v in ipairs( frame.args ) do if sep then if v ~= '' then table.insert(args, v) end else sep = v end end return table.concat( args, sep or '' ) end -- findpagetext returns the position of a piece of text in a page -- First positional parameter or |text is the search text -- Optional parameter |title is the page title, defaults to current page -- Optional parameter |plain is either true for plain search (default) or false for Lua pattern search -- Optional parameter |nomatch is the return value when no match is found; default is nil function str._findpagetext(args) -- process parameters local nomatch = args.nomatch or "" if nomatch == "" then nomatch = nil end -- local text = mw.text.trim(args[1] or args.text or "") if text == "" then return nil end -- local title = args.title or "" local titleobj if title == "" then titleobj = mw.title.getCurrentTitle() else titleobj = mw.title.new(title) end -- local plain = args.plain or "" if plain:sub(1, 1) == "f" then plain = false else plain = true end -- get the page content and look for 'text' - return position or nomatch local content = titleobj and titleobj:getContent() return content and mw.ustring.find(content, text, 1, plain) or nomatch end function str.findpagetext(frame) local args = frame.args local pargs = frame:getParent().args for k, v in pairs(pargs) do args[k] = v end if not (args[1] or args.text) then return nil end -- just the first value return (str._findpagetext(args)) end --[[ Helper function that populates the argument list given that user may need to use a mix of named and unnamed parameters. This is relevant because named parameters are not identical to unnamed parameters due to string trimming, and when dealing with strings we sometimes want to either preserve or remove that whitespace depending on the application. ]] function str._getParameters( frame_args, arg_list ) local new_args = {} local index = 1 local value for _, arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index] index = index + 1 end new_args[arg] = value end return new_args end --[[ Helper function to handle error messages. ]] function str._error( error_str ) local frame = mw.getCurrentFrame() local error_category = frame.args.error_category or 'Errors reported by Module String' local ignore_errors = frame.args.ignore_errors or false local no_category = frame.args.no_category or false if str._getBoolean(ignore_errors) then return '' end local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>' if error_category ~= '' and not str._getBoolean( no_category ) then error_str = '[[Category:' .. error_category .. ']]' .. error_str end return error_str end --[[ Helper Function to interpret boolean strings ]] function str._getBoolean( boolean_str ) local boolean_value if type( boolean_str ) == 'string' then boolean_str = boolean_str:lower() if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' or boolean_str == '' then boolean_value = false else boolean_value = true end elseif type( boolean_str ) == 'boolean' then boolean_value = boolean_str else error( 'No boolean value found' ) end return boolean_value end --[[ Helper function that escapes all pattern characters so that they will be treated as plain text. ]] function str._escapePattern( pattern_str ) return ( string.gsub( pattern_str, "[%(%)%.%%%+%-%*%?%[%^%$%]]", "%%%0" ) ) end return str a3717be7740b8299448ef51ae8300caf00c3cac6 Module:String/doc 828 557 873 2025-08-21T20:02:33Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Module:String|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Module:String|Module and documentation on Wikipedia]] <noinclude>[[Category:Module documentation pages]]</noinclude> 762229bd4719989f582c0ab0a6164c27e7dd989c Template:Main other 10 558 874 2025-08-21T20:05:16Z Sharparam 284703 Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:0}} | main | other }} }} | main = {{{1|}}} | other | #default = {{{2|}}} }}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude>" wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:0}} | main | other }} }} | main = {{{1|}}} | other | #default = {{{2|}}} }}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude> 86ad907ffeea3cc545159e00cd1f2d6433946450 Template:Main other/doc 10 559 875 2025-08-21T20:07:20Z Sharparam 284703 Created page with "== External links == * [[mw:Template:Main other|Template on MediaWiki]] <includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == External links == * [[mw:Template:Main other|Template on MediaWiki]] <includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude> 89ed25ee7894a7a296aa3e7017ad4b3942444395 Category:Namespace manipulation templates 14 560 876 2025-08-21T20:07:33Z Sharparam 284703 Created blank page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Template:Infobox/Ring 10 561 877 2025-08-21T20:08:18Z Sharparam 284703 Created page with "<includeonly>{{#invoke:infobox|main | kind = ring | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = ring | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude> 4e47a92e54ae186ca95884a7814fd17d484e6f19 Template:Infobox/Ring/doc 10 562 878 2025-08-21T20:09:51Z Sharparam 284703 Created page with "== Example == {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == Example == {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 3a0fcf05ffaac79fbaebadf1c4c33a7e5bb61b00 Amulets 0 444 879 654 2025-08-21T20:11:19Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox/Amulets}} [[Category:Amulets]] a1dffe598e440da35929b53420fd1a9c97aca8d4 Category:Amulets 14 563 880 2025-08-21T20:11:42Z Sharparam 284703 Created page with "[[Amulets]] in {{BFF}}. [[Category:Equipment]]" wikitext text/x-wiki [[Amulets]] in {{BFF}}. [[Category:Equipment]] 0df5616094b34d958f04a0b771cb3febedfb2a3e Template:Infobox/Amulet 10 564 881 2025-08-21T20:13:12Z Sharparam 284703 Created page with "<includeonly>{{#invoke:infobox|main | kind = amulet | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }} {{Main other|[[Categoryr:Amulets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = amulet | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }} {{Main other|[[Categoryr:Amulets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude> 59c7689eb27247274be01dad72a94fd39ab0f116 883 881 2025-08-21T20:15:25Z Sharparam 284703 Fix typo wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = amulet | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} }} {{Main other|[[Category:Amulets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude> 98dd406e69d315cc644122750f3274345ee67c16 Template:Infobox/Amulet/doc 10 565 882 2025-08-21T20:14:12Z Sharparam 284703 Created page with "== Example == {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == Example == {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Amulet | title = Amulet of Kings | image = Amulet of Kings.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude> 407f3f75b4941c92d58979ccedaae629985e2034 Category:Armor sets 14 566 884 2025-08-21T20:17:24Z Sharparam 284703 Created page with "[[Armor sets]] in {{BFF}}. [[Category:Armor]]" wikitext text/x-wiki [[Armor sets]] in {{BFF}}. [[Category:Armor]] 4261c8c87af5c69c1fd95f9b534cdaa03bda2565 Category:Armor 14 567 885 2025-08-21T20:17:39Z Sharparam 284703 Created page with "[[Armor]] in {{BFF}}. [[Category:Equipment]]" wikitext text/x-wiki [[Armor]] in {{BFF}}. [[Category:Equipment]] 1d8c33f61240ee031af7c8bc9003e6c464e562f2 Category:Shields 14 568 886 2025-08-21T20:18:20Z Sharparam 284703 Created page with "[[Shields]] in {{BFF}}. [[Category:Equipment]]" wikitext text/x-wiki [[Shields]] in {{BFF}}. [[Category:Equipment]] feeed44abd585d1042d90c77b1d9917cbbfc6847 Category:Dual Wields 14 469 887 703 2025-08-21T20:19:05Z Sharparam 284703 Add category wikitext text/x-wiki [[Category:Two-handed weapons]] [[Category:Weapons]] d1d70b00110573e778b25c45bea57d07228f8da8 Category:Two-handed weapons 14 569 888 2025-08-21T20:19:19Z Sharparam 284703 Add category wikitext text/x-wiki [[Category:Weapons]] febdf29cf9dcbef034e184720fe19a5ac5f353d8 Category:Staves 14 570 889 2025-08-21T20:20:01Z Sharparam 284703 Created page with "[[Staves]] in {{BFF}}. [[Category:Ranged weapons]]" wikitext text/x-wiki [[Staves]] in {{BFF}}. [[Category:Ranged weapons]] fbcb5b72d01c72093ae71f361c912b871222d451 Category:Ranged weapons 14 571 890 2025-08-21T20:20:16Z Sharparam 284703 Created page with "[[Category:Weapons]]" wikitext text/x-wiki [[Category:Weapons]] febdf29cf9dcbef034e184720fe19a5ac5f353d8 Template:Infobox/Weapon 10 451 891 667 2025-08-21T20:23:12Z Sharparam 284703 Improve categorisation wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 57581ea141193600dd7a356e55ba1811c1743f42 Template:Infobox/Item 10 417 892 597 2025-08-21T20:28:13Z Sharparam 284703 Improve categorisation wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | title={{{title|{{PAGENAME}}}}} | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{Main other|{{#switch:{{lc:{{{type|}}}}} | essential = [[Category:Essential items]] | upgrade = [[Category:Upgrade items]] | #default = [[Category:Items]] }}}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> 9bd3533dad3a53907b2b069897e3830faeed6721 Ability Splinter 0 430 893 623 2025-08-21T20:29:24Z Sharparam 284703 Add infobox wikitext text/x-wiki {{Infobox/Item | type = essential | image = Ability Splinter.png }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. It is used to equip and change [[abilities]]. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found near the [[Paladin Mace]]. Facing where the mace is, head left and slightly behind and look behind the large pillar to find the item. || {{coords|-4581|-7721|5575}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and keep right until you get to the room with a staircase going down. Before heading down the staircase, walk around it on its right and check the corner to find the item. || {{coords|1120|-7590|161}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the second right to get to the edge of the cliff with a bunch of graves. The item can be found near one of the graves. || {{coords|1321|-8034|190}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || Starting from the [[Homunculus]], go through the doorway and take the left path. In the outdoors area, head up the stairs and take the left path to a cliff. Climb the cliff by repeatedly tapping the jump button. Once at the top, take the path leading down and follow it past a group of buildings (where the [[Soul Reaper]] can be found). Past the buildings are a set of graves with the item on top of one of them. |} {{Navbox/Items}} f41049ed237d82ef6acd68f7fb96cabec6e868ee Handler Echo 0 421 894 605 2025-08-21T20:30:16Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | image = Handler Echo.png | title = {{PAGENAME}} | type = essential | Description = An obscure residue used to supplement [[The Handler|the Handler's]] capabilities. [[The Handler]] can use this to upgrade [[equipment]] more effectively. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to level up [[The Handler]], in order to increase the max level equipment can be upgraded to. == Usage == If the item is in your inventory, [[The Handler]] will automatically level up when you next interact with her. A message will also pop up in the bottom right corner of the screen informing you of the new synchronization level. == Acquisition == * Drops from [[Konrad the Traitor]]. * Can drop from samurai enemies in [[Uranopolis]] (limited to one drop). == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Rain District]] || Up some stairs. || {{coords|-36697.35|-17753.66|12174.48}} |- | [[Asylum]] || In the spiral staircase with the shortcut door to the courtyard there is a floating ghost. Move through the ghost and the echo will be right behind it. || {{coords|-4225|6824|9253}} |- | [[Desert]] || In the big building after the sand worm, where Yaroslav's crew is. The echo is sitting on a toppled pillar. || {{coords|3720|1159|-1397}} |} {{Navbox/Items}} dc3fe45dda237d7748a0cf867d250cff08fedcec Homunculus Mirage 0 423 895 609 2025-08-21T20:30:47Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | type = essential | tabs=Normal,Husk | Normal_title = Homunculus Mirage | Husk_title = Humunculus Mirage Husk | images = [[File:Homunculus Mirage.png|300px]],[[File:Homunculus Mirage Husk.png|300px]] | Normal_Description = The Homunculus triggers its ability only when your vital signs have ceased – reassembling your body on a molecular level elsewhere while keeping your consciousness intact, allowing for seamless and instantaneous relocation. | Husk_Description = The husk of the Homunculus stores your current state and consciousness. Return at the Homunculus to combine the two again, allowing you to place the Homunculus elsewhere. }} {{Navbox/Items}} 903487e48beaa0c93f10e0a63a5d4c122f9906d6 Old Key 0 429 896 621 2025-08-21T20:31:16Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Old Key.png | type = essential | Description = An old, rusted key that unlocks the gate in the old [[Monastery|monastery]]. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Location == {{coords|19328.57|-41596.65|3.83}} Found at the top of the [[Monastery]], behind [[Konrad the Traitor]]. Killing the boss is not required to pick it up. == Usage == Unlocks the gate at the top of the [[Monastery]], found near the entrance to [[Konrad the Traitor|Konrad the Traitor's]] boss arena (keep going past the entrance instead of entering it). {{Navbox/Items}} 35b7568dcd6463e558a8716ab5e0df86bc0371e0 Perk Essence 0 424 897 611 2025-08-21T20:31:35Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | type = essential | tabs = Stable,Unstable | images = [[File:Perk Essence.png|300px]],[[File:Unstable Perk Essence.png|300px]] | Stable_title = Perk Essence | Unstable_title = Unstable Perk Essence | Stable_Description = An artifact used in the process of embedding perks. | Unstable_Description = Get to a checkpoint to turn it into a perk, on death goes back to it's [sic] original location. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] used to acquire [[perks]] or perk upgrades. == Acquisition == The unstable variant drops from some [[bosses]] (excluding mini-bosses), bringing it to a [[homunculus]] without dying stabilises it. It has to be brought to a normal homunculus, not one spawned by the [[Homunculus Mirage]]. Dying on the way to a homunculus while the item is still in its unstable form will respawn it in the boss's arena, forcing the player to go back and pick it up again. {{Navbox/Items}} 06df31e4640020666782a66b6361d649f91516a8 Plagued Blood 0 422 898 607 2025-08-21T20:31:52Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Plagued Blood.png | type = essential | Description = Harvested from a burial site, this unsettling vial contains a sample of plagued blood belonging to a Revenant. }} == Location == {{coords|-3898|1671|1585}} Located at the top of the big tower in [[Asylum|the asylum]], after climbing a staircase into a room with a bunch of empty bookshelves, look to your right to see the item on a table. == Usage == Having this item in your inventory allows for spawning some optional bosses. * [[Plagued Warden]] * [[Plagued Revenant]] {{Navbox/Items}} 14acdb051f6e55b447efed3ac05a0b7c62007bc6 Scanner 0 374 899 511 2025-08-21T20:32:13Z Sharparam 284703 Add type to infobox wikitext text/x-wiki {{Infobox/Item | image = Scanner.png | title = {{PAGENAME}} | type = essential | Description = Captures and interprets data across hidden and abstract dimensions, revealing information that transcends conventional spatial and temporal limits, providing a comprehensive view of both visible and imperceptible phenomena. }} The '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == Activating the item scans the area around the player, revealing important interactables like [[data logs]] and ladders. {{Navbox/Items}} [[Category:Lore]] 6dde4eac60da31a5e41858bdeed680e9dda22183 Upgrade Splinter 0 432 900 627 2025-08-21T20:33:07Z Sharparam 284703 Add infobox wikitext text/x-wiki {{Infobox/Item | image = Upgrade Splinter.png | type = upgrade }} '''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}} |} {{Navbox/Items}} b9f020a57eb70f08cefe430eb0760284abd62b57 901 900 2025-08-21T20:34:13Z Sharparam 284703 Add "See also" for [[Upgrade Module]] wikitext text/x-wiki {{Infobox/Item | image = Upgrade Splinter.png | type = upgrade }} '''{{PAGENAME}}''' is an item found in {{BFF}} used to enhance [[weapons]] and [[armor]] to Mk 1, 2, and 3. == Locations == {| class="wikitable" ! Area !! Description !! Coordinates |- | [[Deluge]] || Found in the first big rectangular structure with pillars, near the [[Paladin Mace]]. Facing where the mace is, head right and past the red traffic light to find the item sitting on a ledge. || {{coords|-5173|-1105|5626}} |} == See also == * [[Upgrade Module]] – To upgrade to Mk 4 and 5. {{Navbox/Items}} 4d57ed9542043b3fdb63d30bfaa147497119f15c Upgrade Module 0 425 902 613 2025-08-21T20:35:20Z Sharparam 284703 Add type to infobox and note for [[Upgrade Splinter]] wikitext text/x-wiki {{Infobox/Item | title = {{PAGENAME}} | image = Upgrade Module.png | type = upgrade | Description = A rare artifact used in the process of upgrading gear. }} '''{{PAGENAME}}''' is an [[Upgrade items|upgrade item]] in {{BFF}}. It is used to upgrade equipment to Mk 4 and 5. == See also == * [[Upgrade Splinter]] – To upgrade to Mk 1, 2, and 3. {{Navbox/Items}} c999ea8a43c85cc912948b06f8657a194aeea34e Category:Upgrade items 14 419 903 601 2025-08-21T20:35:43Z Sharparam 284703 Change category to essential items wikitext text/x-wiki [[Category:Essential items]] 4679e283883b6184f5cfc91470c12804eae20cb9 Category:Weapons 14 468 904 701 2025-08-21T20:36:27Z Sharparam 284703 Add link to [[Weapons]] and category wikitext text/x-wiki [[Weapons]] are equipment the player can use to damage monsters and defend themselves. [[Category:Equipment]] 9906cbd32ff766765cc3704c8230f08d17b42c05 Category:One-handed weapons 14 572 905 2025-08-21T20:36:53Z Sharparam 284703 Add category wikitext text/x-wiki [[Category:Weapons]] febdf29cf9dcbef034e184720fe19a5ac5f353d8 Category:Longbows 14 573 906 2025-08-21T20:37:23Z Sharparam 284703 Created page with "[[Category:Ranged weapons]]" wikitext text/x-wiki [[Category:Ranged weapons]] f11922e287203334625452a716db9708dbdb2fe2 Arcane Bow 0 509 907 783 2025-08-21T20:37:51Z Sharparam 284703 Fix type wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Arcane Bow.png | Type = Longbow | Damage type = Sharp | Speed = Fast | Passives = Vermillion Judgment | Abilities = Arrow Twister | Mk2_Damage_min = 184 | Mk2_Damage_max = 197 | Mk3_Damage_min = 251 | Mk3_Damage_max = 267 | Mk4_Damage_min = 292 | Mk4_Damage_max = 312 | Mk5_Damage_min = 334 | Mk5_Damage_max = 356 }} '''{{PAGENAME}}''' is a [[Bows|bow]] in {{BFF}}. == Location == {{coords|1261|-8400|1563}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the left path. When in the outdoors area, head into the path on the right before the big stairs. Take the ladder at the end getting up onto a building, and then the next one. The item will be in the corner of the roof on a corpse. {{Navbox/Weapons}} c71bb9590b06d49cf37461cb2e73d4ceb69e4775 Taskmaster 0 510 908 785 2025-08-21T20:38:10Z Sharparam 284703 Fix type wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Taskmaster.png | Type = Longbow | Damage type = Sharp | Speed = Fast | Passives = Rapid Fire, Critical Strike | Mk2_Damage_min = 240 | Mk2_Damage_max = 256 }} '''{{PAGENAME}}''' is a [[Ranged weapons|ranged weapon]] in {{BFF}}. == Location == {{coord|4052|1265|-1412}} Located in the [[Desert]]. After meeting [[Yaroslav|Yaroslav's]] crew and passing through the passage to the big open area, look slightly to the left and you'll see the bow resting against some run down brick arches. {{Navbox/Weapons}} 2e790f8146f1b835c896cbaa546ab613a5058893 File:Sharparam.png 6 574 909 2025-08-21T20:39:28Z Sharparam 284703 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 910 909 2025-08-21T20:40:07Z Sharparam 284703 Protected "[[File:Sharparam.png]]": Profile image for a user ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Blade Dash 0 575 912 911 2025-08-21T20:42:30Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ability | image = OrientalDash.png | title = Blade Dash | Cost = 45 | Cooldown = 15 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} d8d63bcf9e2ab9e7610a637cbfae9e493d98a50d Whirlwind Strike 0 576 914 913 2025-08-21T20:42:30Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ability | image = OrientalSpin.png | title = Whirlwind Strike | Cost = 75 | Cooldown = 25 | Description = Swing your weapon several times, dealing damage to all enemies in a frontal cone. }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} e6c1e11c6f18f8785af475d924c7d62d672fe3b3 Divine Blessing 0 577 916 915 2025-08-21T20:42:30Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ability | image = Divine Blessing.png | title = {{PAGENAME}} | Cost = 125 | Cooldown = 30 | Description = Restore 30% of your total [[HP]] and deal damage to all nearby [[Plague|plagued]] [[enemies]]. }} '''{{PAGENAME}}''' is a [[Weapons|weapon]] [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} 552de679ebb2751ab76780e73c8c534074b51109 Template:Navbox/Abilities 10 578 917 2025-08-21T20:43:15Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Abilities | title = Abilities | list1 = * [[Blade Dash]] * [[Divine Blessing]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = Abilities | list1 = * [[Blade Dash]] * [[Divine Blessing]] }}<noinclude>{{Documentation}}</noinclude> 248794f927ba5a321603494f50191d9afdccac76 918 917 2025-08-21T20:43:45Z Sharparam 284703 Add [[Whirlwind Strike]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = Abilities | list1 = * [[Blade Dash]] * [[Divine Blessing]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> 1c55ce1234b5272317e8123c68b027c0096255b8 920 918 2025-08-21T20:45:06Z Sharparam 284703 Link to abilities page wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Blade Dash]] * [[Divine Blessing]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> b98da907f8e5f4b2ad9e5c5c7fc0502d0bf982cc Template:Navbox/Abilities/doc 10 579 919 2025-08-21T20:44:22Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude> 87827f6829955b934e0e8073491c0fef23954bf8 Abilities 0 580 921 2025-08-21T20:46:54Z Sharparam 284703 Created page with "'''Abilities''' are special skills that can be found on some [[weapons]]. {{Navbox/Abilities}} [[Category:Abilities]]" wikitext text/x-wiki '''Abilities''' are special skills that can be found on some [[weapons]]. {{Navbox/Abilities}} [[Category:Abilities]] 4fe632a6dc4cee00686ec11acc1158dbb0dfb610 Category:Abilities 14 581 922 2025-08-21T20:47:08Z Sharparam 284703 Created page with "[[Abilities]] in {{BFF}}." wikitext text/x-wiki [[Abilities]] in {{BFF}}. ffb5b26c014e453bf5d766e2b1ebcdfaf27c1ad9 File:Scanner.png 6 582 923 2025-08-21T20:52:24Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad 929 923 2025-08-21T20:58:57Z Sharparam 284703 Add game image template wikitext text/x-wiki {{Game image}} == Licensing == {{License|game}} 3270ce19f01542118cc5c866db430fc73423612a Template:File other 10 583 924 2025-08-21T20:54:17Z Sharparam 284703 Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:6}} | file | other }} }} | file | image = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude>" wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:6}} | file | other }} }} | file | image = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{Documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 0ae5bdb15fbe55f5787d00f85a443e4eac787c5e Template:File other/doc 10 584 925 2025-08-21T20:55:18Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Namespace manipulation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 0db4fcf6efd8e3996b46bb02dce919df6124f748 Template:Game image 10 585 926 2025-08-21T20:55:42Z Sharparam 284703 Created page with "<includeonly>{{File other|[[Category:Game images]]}}</includeonly><noinclude> {{Documentation}} </noinclude>" wikitext text/x-wiki <includeonly>{{File other|[[Category:Game images]]}}</includeonly><noinclude> {{Documentation}} </noinclude> c78a04923d00959be766f2908911a29b71cc1209 Template:Game image/doc 10 586 927 2025-08-21T20:57:55Z Sharparam 284703 Created page with "Use on files that are images exported from the game. Places the file in the [[:Category:Game images|game images]] category. == Usage == {{Tlx|Game image}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Use on files that are images exported from the game. Places the file in the [[:Category:Game images|game images]] category. == Usage == {{Tlx|Game image}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 943ab5144b7869a9247c146638e1335b709d6c1f Category:File templates 14 587 928 2025-08-21T20:58:16Z Sharparam 284703 Created page with "Templates to help work with or categorise files." wikitext text/x-wiki Templates to help work with or categorise files. f23108893b2522f523cb55d4a4a4bfa79744cca6 Category:Game images 14 588 930 2025-08-21T20:59:29Z Sharparam 284703 Created page with "Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category." wikitext text/x-wiki Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category. 912de8fa5fb07765ad87496f457aaa1eacc6b8f9 931 930 2025-08-21T20:59:51Z Sharparam 284703 Add parent category wikitext text/x-wiki Images extracted from the game files. Use the {{tl|Game image}} template to place files into this category. [[Category:Game assets]] b72293034ec9442cf0a59178bb392cd2dc85c4f9 Category:Game assets 14 589 932 2025-08-21T21:00:34Z Sharparam 284703 Created page with "Assets/files that have been sourced directly from the game files of {{BFF}}." wikitext text/x-wiki Assets/files that have been sourced directly from the game files of {{BFF}}. c36e430ebb51e2f3a5bb681e61f314fde5047b1a 933 932 2025-08-21T21:00:57Z Sharparam 284703 Add template instruction wikitext text/x-wiki Assets/files that have been sourced directly from the game files of {{BFF}}. Use the {{tl|Game asset}} template to place files into this category. 266793c2d375aa979be2e77e4ce56c927328281d Template:Game asset 10 590 934 2025-08-21T21:01:25Z Sharparam 284703 Created page with "<includeonly>{{File other|[[Category:Game assets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{File other|[[Category:Game assets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude> 1a4fad2b6dfc8a0d60ebdbe1b0d46e89842c5b99 Template:Game asset/doc 10 591 935 2025-08-21T21:02:51Z Sharparam 284703 Created page with "Template to place files into the [[:Category:Game assets|game assets]] category. If the file is an image or audio file, use {{tl|Game image}} or {{tl|Game audio}} instead, respectively. == Usage == {{tlx|Game asset}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Template to place files into the [[:Category:Game assets|game assets]] category. If the file is an image or audio file, use {{tl|Game image}} or {{tl|Game audio}} instead, respectively. == Usage == {{tlx|Game asset}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 6d2473959585275d27b6bd903f738e328c8d53a2 Template:Game audio 10 592 936 2025-08-21T21:03:24Z Sharparam 284703 Created page with "<includeonly>{{File other|[[Category:Game audio]]}}</includeonly> <noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{File other|[[Category:Game audio]]}}</includeonly> <noinclude>{{Documentation}}</noinclude> 78524f1842114d188967471f6571bdb2f0359cae Template:Game audio/doc 10 593 937 2025-08-21T21:04:11Z Sharparam 284703 Created page with "Places files into the [[:Category:Game audio|game audio]] category. == Usage == {{tlx|Game audio}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Places files into the [[:Category:Game audio|game audio]] category. == Usage == {{tlx|Game audio}} <includeonly>{{Sandbox other||[[Category:File templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> d575cc599795375aaa040ff4b63e265bdd18bc57 Category:Game audio 14 594 938 2025-08-21T21:04:40Z Sharparam 284703 Created page with "Audio files that have been extracted from the game files of {{BFF}}. Place files into this category by using the {{tl|Game audio}} template. [[Category:Game assets]]" wikitext text/x-wiki Audio files that have been extracted from the game files of {{BFF}}. Place files into this category by using the {{tl|Game audio}} template. [[Category:Game assets]] 1f7a2e55596868ce0dc93944e9b7eee2792f96ba File:Katanas.png 6 595 939 2025-08-21T21:06:16Z Sharparam 284703 {{Game image}} wikitext text/x-wiki == Summary == {{Game image}} == Licensing == {{License|game}} e84980f43421c792e6f1c8e1312cd5fa11b6864e File:Sharp outlined.png 6 596 940 2025-08-21T21:07:44Z Sharparam 284703 Modified version of the icon from the game files to add a black outline. wikitext text/x-wiki == Summary == Modified version of the icon from the game files to add a black outline. == Licensing == {{License|game}} d8df869b47897c8edf3e2084037876caca074149 File:Blunt outlined.png 6 597 941 2025-08-21T21:08:57Z Sharparam 284703 Modified version of the icon from the game files to add a black outline. wikitext text/x-wiki == Summary == Modified version of the icon from the game files to add a black outline. == Licensing == {{License|game}} d8df869b47897c8edf3e2084037876caca074149 File:Technomancy outlined.png 6 598 942 2025-08-21T21:09:12Z Sharparam 284703 Modified version of the icon from the game files to add a black outline. wikitext text/x-wiki == Summary == Modified version of the icon from the game files to add a black outline. == Licensing == {{License|game}} d8df869b47897c8edf3e2084037876caca074149 File:Sharp.png 6 599 943 2025-08-21T21:09:46Z Sharparam 284703 {{Game image}} wikitext text/x-wiki == Summary == {{Game image}} == Licensing == {{License|game}} e84980f43421c792e6f1c8e1312cd5fa11b6864e File:Blunt.png 6 600 944 2025-08-21T21:10:08Z Sharparam 284703 {{Game image}} wikitext text/x-wiki == Summary == {{Game image}} == Licensing == {{License|game}} e84980f43421c792e6f1c8e1312cd5fa11b6864e File:Technomancy.png 6 601 945 2025-08-21T21:10:26Z Sharparam 284703 {{Game image}} wikitext text/x-wiki == Summary == {{Game image}} == Licensing == {{License|game}} e84980f43421c792e6f1c8e1312cd5fa11b6864e File:Uranopolis (Tower Complex).png 6 602 946 2025-08-21T21:14:25Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_Entrance.png }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_Entrance.png }} == Licensing == {{License|game}} fb338377a1c6697787483e018e773b122f2b82dd File:Uranopolis (Lone Tower).png 6 603 947 2025-08-21T21:15:15Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_LoneTower.png }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Uranopolis_LoneTower.png }} == Licensing == {{License|game}} f379939b05f5531092f6cb5c5da18ed46af2958b Uranopolis 0 352 948 467 2025-08-21T21:15:46Z Sharparam 284703 Fix second sub-location todo wikitext text/x-wiki '''Uranopolis''' is a location in {{BFF}}. == Sub-locations == Uranopolis consists of two sub-locations: Tower Complex and Lone Tower. === Tower Complex === {{Main|Uranopolis/Tower Complex}} [[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]] The '''Tower Complex''' is the first sub-location encountered by the player. {{clear}} === Lone Tower === [[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]] The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here. {{Navbox/Locations}} [[Category:Locations]] c3a53919ad49c80b8ca6ecf37e88e385e707727b File:Monastery (Lower).png 6 604 949 2025-08-21T21:16:47Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monasatery_Bridge.png }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monasatery_Bridge.png }} == Licensing == {{License|game}} 2a25eca089eb36a086905fe8b30501e05598829b File:Monastery (Upper).png 6 605 950 2025-08-21T21:17:30Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monastery_Upper.png }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Monastery_Upper.png }} == Licensing == {{License|game}} 07f3467b9dd417d832f5d06d38aa7630d48e8745 Category:Locations 14 606 951 2025-08-21T21:18:52Z Sharparam 284703 Created page with "[[Locations]] in {{BFF}}." wikitext text/x-wiki [[Locations]] in {{BFF}}. abf5a13f9593d93b2f288c96a230460de31f1da2 Locations 0 351 952 465 2025-08-21T21:19:09Z Sharparam 284703 Add category wikitext text/x-wiki {{Navbox/Locations}} [[Category:Locations]] 867a4bbec1bc92e57b6daf306356c7fd1fee46af Template:Sic 10 607 953 2025-08-21T21:19:23Z Sharparam 284703 Created page with "<!-- Display the first two default parameters unless ? -->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!-- Display options for [sic] linked, unlinked(default) or hidden. -->{{#if:{{{hide|}}}||&#32;&#91;''{{#if:{{{nolink|}}}|sic|[[sic]]}}{{#ifeq:{{{1|}}}|?|?}}''&#93;}}<!-- Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]] --><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||Category:Articles..." wikitext text/x-wiki <!-- Display the first two default parameters unless ? -->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!-- Display options for [sic] linked, unlinked(default) or hidden. -->{{#if:{{{hide|}}}||&#32;&#91;''{{#if:{{{nolink|}}}|sic|[[sic]]}}{{#ifeq:{{{1|}}}|?|?}}''&#93;}}<!-- Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]] --><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude> {{documentation}} </noinclude> ca36b46c4c83b9a5c2bd1e9028abaeb475e53018 954 953 2025-08-21T21:19:55Z Sharparam 284703 Fix link to sic on WP wikitext text/x-wiki <!-- Display the first two default parameters unless ? -->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!-- Display options for [sic] linked, unlinked(default) or hidden. -->{{#if:{{{hide|}}}||&#32;&#91;''{{#if:{{{nolink|}}}|sic|[[wikipedia:sic]]}}{{#ifeq:{{{1|}}}|?|?}}''&#93;}}<!-- Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]] --><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude> {{documentation}} </noinclude> f4a1d499c2aee37410d1b095a38a7cb8d7bf948a 955 954 2025-08-21T21:20:10Z Sharparam 284703 Fix sic link showing interwiki prefix wikitext text/x-wiki <!-- Display the first two default parameters unless ? -->{{#ifeq:{{{1|?}}}|?|{{{2|}}}{{{3|}}}|{{{1|}}}{{{2|}}}}}<!-- Display options for [sic] linked, unlinked(default) or hidden. -->{{#if:{{{hide|}}}||&#32;&#91;''{{#if:{{{nolink|}}}|sic|[[wikipedia:sic|sic]]}}{{#ifeq:{{{1|}}}|?|?}}''&#93;}}<!-- Categorisation options. Currently disabled - see [[Help talk:CS1 errors/Archive 1#%7B%7Bsic%7C?%7Cnolink=y%7D%7D]] --><!--{{#ifeq:{{{1|}}}|?|{{#if:{{NAMESPACE}}||[[Category:Articles containing possible transcription errors]]}}}}--><noinclude> {{documentation}} </noinclude> 122173e063529ad4cdba860981e6080c8105c537 Template:Sic/doc 10 608 956 2025-08-21T21:21:27Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Template:Sic|Template and documentation on Wikipedia]] <includeonly>{{Sandbox other||[[Category:Inline templates]][[Category:Typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Template:Sic|Template and documentation on Wikipedia]] <includeonly>{{Sandbox other||[[Category:Inline templates]][[Category:Typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 50e8c0b6c03f834f0c33ead4b4688565c98ce30e Category:Inline templates 14 609 957 2025-08-21T21:21:46Z Sharparam 284703 Created page with "Templates that can/should be used inline." wikitext text/x-wiki Templates that can/should be used inline. 2b990a2df2dd087ebac8b1f311d1752d5b47b3fa MediaWiki:Sidebar 8 324 958 418 2025-08-21T21:26:50Z Sharparam 284703 Add useful links to sidebar wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** Special:NewFiles|New files ** randompage-url|randompage * Bleak Faith ** Items ** Locations ** NPCs ** Enemies ** Bosses * sidebar-customizing-wiki ** MediaWiki:Sidebar|sidebar-edit-sidebar ** MediaWiki:Common.css|sidebar-edit-common-css ** MediaWiki:Vector.css|sidebar-edit-vector-css ** MediaWiki:Common.js|sidebar-edit-common-js ** Special:Gadgets|sidebar-gadgets ** Special:Import|sidebar-special-import ** Special:Export|sidebar-special-export ** Special:AllPages|sidebar-all-pages ** Special:SpecialPages|sidebar-special-pages * wiki.gg ** support:|sidebar-support-wiki ** Wikigg-ticket-link|sidebar-submit-ticket ** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar 728fcc8f8362af28c1f933fc508a2334547f135a File:Blok 6147.png 6 610 959 2025-08-21T21:28:04Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Blok.png }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Blok.png }} == Licensing == {{License|game}} 9839db94437e0e25d6cc026c5150e038d2f724c2 Homunculus 0 611 960 2025-08-21T21:28:36Z Sharparam 284703 Created page with "'''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Des..." wikitext text/x-wiki '''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Description !! Coordinates |- | [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}} |- | [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}} |- | [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}} |- | [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}} |- | [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}} |- | [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}} |- | [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}} |- | [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}} |- | [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}} |- | [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}} |- | rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}} | Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}} |- | After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}} |- | After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}} |} == Notes == {{notelist|refs= {{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}} }} == External links == * [[w:Homunculus|Homunculus on Wikipedia]] a2232f7ee4c2f2293347db7ee209a477b56b6bb4 975 960 2025-08-21T21:33:46Z Sharparam 284703 Fix link to Wikipedia wikitext text/x-wiki '''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Description !! Coordinates |- | [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}} |- | [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}} |- | [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}} |- | [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}} |- | [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}} |- | [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}} |- | [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}} |- | [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}} |- | [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}} |- | [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}} |- | rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}} | Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}} |- | After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}} |- | After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}} |} == Notes == {{notelist|refs= {{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}} }} == External links == * [[wikipedia:Homunculus|Homunculus on Wikipedia]] 829f2024ba392d81a9d14c59df992c329ac23b2d Template:Notelist 10 612 962 961 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude> {{Documentation}}</noinclude> 94f17b894235ff18c73072096f5940cdbcc5b719 Template:Reflist 10 613 964 963 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported wikitext text/x-wiki <templatestyles src="Reflist/styles.css" /><div class="reflist<!-- -->{{#if:{{{1|}}}{{{colwidth|}}}|&#32;reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}} | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = reflist-{{{liststyle|{{{group}}}}}} }}" <!-- End class, start style -->{{#if:{{{1|}}} | {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}} | {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}} }}> {{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude> {{Documentation}}</noinclude> 5865246773ff390ed5700866ea2396d78a81b01f Module:Check for unknown parameters 828 614 966 965 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported Scribunto text/plain -- This module may be used to compare the arguments passed to the parent -- with a list of arguments, returning a specified result if an argument is -- not on the list local p = {} local function trim(s) return s:match('^%s*(.-)%s*$') end local function isnotempty(s) return s and trim(s) ~= '' end function p.check (frame) local args = frame.args local pargs = frame:getParent().args local ignoreblank = isnotempty(frame.args['ignoreblank']) local checkpos = isnotempty(frame.args['checkpositional']) local knownargs = {} local unknown = frame.args['unknown'] or 'Found _VALUE_, ' local preview = frame.args['preview'] local res = {} local regexps = {} local comments = {} local commentstr = '' local ispreview = frame:preprocess( "{{REVISIONID}}" ) == "" and 1 or 0 -- create the list of known args, regular expressions, and the return string for k, v in pairs(args) do if type(k) == 'number' then v = trim(v) knownargs[v] = 1 elseif k:find('^regexp[1-9][0-9]*$') then table.insert(regexps, '^' .. v .. '$') end end if isnotempty(preview) then preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>' elseif preview == nil then preview = unknown end if ispreview == 1 then unknown = preview ignoreblank = false end -- adds one result to the output tables local function addresult(k) if k == '' then -- Fix odd bug for | = which gets stripped to the empty string and -- breaks category links k = ' ' end local r = unknown:gsub('_VALUE_', k) table.insert(res, r) table.insert(comments, '"' .. k .. '"') end -- loop over the parent args, and make sure they are on the list for k, v in pairs(pargs) do if type(k) == 'string' and knownargs[k] == nil then local knownflag = false for i, regexp in ipairs(regexps) do if mw.ustring.match(k, regexp) then knownflag = true break end end if not knownflag and ( not ignoreblank or isnotempty(v) ) then k = mw.ustring.gsub(k, '[^%w%-_ ]', '?') addresult(k) end elseif checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil and ( not ignoreblank or isnotempty(v) ) then addresult(k) end end if #comments > 0 then commentstr = '<!-- Module:Check for unknown parameters results: ' .. table.concat(comments, ', ') .. '-->' end return table.concat(res) .. commentstr end return p 90cb45a6cbe02f0d73cbfdec8233df899b000e3d Template:Note 10 615 968 967 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#if:{{{name|}}} |{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|name={{{name|}}}|group={{#switch: {{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }} }} |{{#tag:ref|{{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}|group={{#switch: {{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }} }} }}</includeonly><noinclude> {{documentation}} </noinclude> 6ed4e5c148014b92a23bd51d16f3180881bb876c Template:Reflist/styles.css 10 616 970 969 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported sanitized-css text/css .reflist { list-style-type: decimal; margin-bottom: 0.5em; } @media screen { .reflist { font-size: 0.9em; /* Make default font smaller only on screens. */ } } .reflist .references { font-size: 1em; /* Reset font size when nested in reflist. */ list-style-type: inherit; /* Enable custom list-style types. */ margin-bottom: 0; /* Avoid double margin when nested in reflist. */ } .reflist-columns { margin-top: 0.3em; /* Reset top margin for column-embedded lists. */ } .reflist-columns ol { margin-top: 0; } .reflist-columns li { break-inside: avoid-column; /* Avoid elements breaking between columns. */ } .reflist-upper-alpha { list-style-type: upper-alpha; } .reflist-upper-roman { list-style-type: upper-roman; } .reflist-lower-alpha { list-style-type: lower-alpha; } .reflist-lower-greek { list-style-type: lower-greek; } .reflist-lower-roman { list-style-type: lower-roman; } e2f766e5d4d3ee66aca32f6714fef1bc97648e0a Template:Ref 10 617 972 971 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{#if:{{{follow|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}|follow={{{follow|}}}}}|{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude> 9fd4ba12eab57eadfed1197d60df81947547d276 MediaWiki:Cite link label group-lower-alpha 8 618 974 973 2025-08-21T21:32:27Z Sharparam 284703 1 revision imported wikitext text/x-wiki a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz aaa aab aac aad aae aaf aag aah aai aaj aak aal aam aan aao aap aaq aar aas aat aau aav aaw aax aay aaz aba abb abc abd abe abf abg abh abi abj abk abl abm abn abo abp abq abr abs abt abu abv abw abx aby abz aca acb acc acd ace acf acg ach aci acj ack acl acm acn aco acp acq acr acs act acu acv acw acx acy acz ada adb adc add ade adf adg adh adi adj adk adl adm adn ado adp adq adr ads adt adu adv adw adx ady adz aea aeb aec aed aee aef aeg aeh aei aej aek ael aem aen aeo aep aeq aer aes aet aeu aev aew aex aey aez afa afb afc afd afe aff afg afh afi afj afk afl afm afn afo afp afq afr afs aft afu afv afw afx afy afz aga agb agc agd age agf agg agh agi agj agk agl agm agn ago agp agq agr ags agt agu agv agw agx agy agz aha ahb ahc ahd ahe ahf ahg ahh ahi ahj ahk ahl ahm ahn aho ahp ahq ahr ahs aht ahu ahv ahw ahx ahy ahz aia aib aic aid aie aif aig aih aii aij aik ail aim ain aio aip aiq air ais ait aiu aiv aiw aix aiy aiz aja ajb ajc ajd aje ajf ajg ajh aji ajj ajk ajl ajm ajn ajo ajp ajq ajr ajs ajt aju ajv ajw ajx ajy ajz aka akb akc akd ake akf akg akh aki akj akk akl akm akn ako akp akq akr aks akt aku akv akw akx aky akz ala alb alc ald ale alf alg alh ali alj alk all alm aln alo alp alq alr als alt alu alv alw alx aly alz ama amb amc amd ame amf amg amh ami amj amk aml amm amn amo amp amq amr ams amt amu amv amw amx amy amz ana anb anc and ane anf ang anh ani anj ank anl anm ann ano anp anq anr ans ant anu anv anw anx any anz aoa aob aoc aod aoe aof aog aoh aoi aoj aok aol aom aon aoo aop aoq aor aos aot aou aov aow aox aoy aoz apa apb apc apd ape apf apg aph api apj apk apl apm apn apo app apq apr aps apt apu apv apw apx apy apz aqa aqb aqc aqd aqe aqf aqg aqh aqi aqj aqk aql aqm aqn aqo aqp aqq aqr aqs aqt aqu aqv aqw aqx aqy aqz ara arb arc ard are arf arg arh ari arj ark arl arm arn aro arp arq arr ars art aru arv arw arx ary arz asa asb asc asd ase asf asg ash asi asj ask asl asm asn aso asp asq asr ass ast asu asv asw asx asy asz ata atb atc atd ate atf atg ath ati atj atk atl atm atn ato atp atq atr ats att atu atv atw atx aty atz aua aub auc aud aue auf aug auh aui auj auk aul aum aun auo aup auq aur aus aut auu auv auw aux auy auz ava avb avc avd ave avf avg avh avi avj avk avl avm avn avo avp avq avr avs avt avu avv avw avx avy avz awa awb awc awd awe awf awg awh awi awj awk awl awm awn awo awp awq awr aws awt awu awv aww awx awy awz axa axb axc axd axe axf axg axh axi axj axk axl axm axn axo axp axq axr axs axt axu axv axw axx axy axz aya ayb ayc ayd aye ayf ayg ayh ayi ayj ayk ayl aym ayn ayo ayp ayq ayr ays ayt ayu ayv ayw ayx ayy ayz aza azb azc azd aze azf azg azh azi azj azk azl azm azn azo azp azq azr azs azt azu azv azw azx azy azz b49c822b47338613f0c10a02bd4f6a2a6735e324 New Game Plus 0 619 976 2025-08-21T21:35:35Z Sharparam 284703 Created page with "{{stub}} '''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap. == Overview == There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3). == Changes == === Max [[level]] === Each time a new iteration is started, the max level ca..." wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap. == Overview == There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3). == Changes == === Max [[level]] === Each time a new iteration is started, the max level cap is increased by 5, until NG+3. After the third restart, the level cap stays the same. This means the maximum possible level that can be attained is 40 (25 from the base game, with an additional 5 from each NG+ iteration up to NG+3). {| class="wikitable mw-collapsible mw-collapsed" style="text-align: right;" ! scope="col" | New Game ! scope="col" | Max level |- | 0 || 25 |- | 1 || 30 |- | 2 || 35 |- | 3 || 40 |} === The Handler === In NG+, [[The Handler]] has an additional location near the first [[Homunculus]] in the [[Monastery#Lower|lower Monastery]]. f120a3e05824c1bb6685e05cbeb802dbfab0ea8d 977 976 2025-08-21T21:35:52Z Sharparam 284703 Add category wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''', also known as '''New Game+''' or '''NG+''', is the option to restart the game after beating it to keep using the same character while increasing the difficulty and the max [[level]] cap. == Overview == There is no limit to how many times the player can restart the game, but there will be no further changes after the third iteration (NG+++, or NG+3). == Changes == === Max [[level]] === Each time a new iteration is started, the max level cap is increased by 5, until NG+3. After the third restart, the level cap stays the same. This means the maximum possible level that can be attained is 40 (25 from the base game, with an additional 5 from each NG+ iteration up to NG+3). {| class="wikitable mw-collapsible mw-collapsed" style="text-align: right;" ! scope="col" | New Game ! scope="col" | Max level |- | 0 || 25 |- | 1 || 30 |- | 2 || 35 |- | 3 || 40 |} === The Handler === In NG+, [[The Handler]] has an additional location near the first [[Homunculus]] in the [[Monastery#Lower|lower Monastery]]. [[Category:Game mechanics]] d3138f3f7fa8eea7813d91a9269fb44c902991af Category:Game mechanics 14 620 978 2025-08-21T21:36:21Z Sharparam 284703 Created page with "Pages that describe concepts that make up how the game works." wikitext text/x-wiki Pages that describe concepts that make up how the game works. 39eae09a03f9fcae63682fe46d2e3ddfb9af495f NG+ 0 621 979 2025-08-21T21:37:00Z Sharparam 284703 Redirected page to [[New Game Plus]] wikitext text/x-wiki #REDIRECT [[New Game Plus]] 8809153b9bcd913847df520edf01980e98855f5b New Game+ 0 622 980 2025-08-21T21:37:15Z Sharparam 284703 Redirected page to [[New Game Plus]] wikitext text/x-wiki #REDIRECT [[New Game Plus]] 8809153b9bcd913847df520edf01980e98855f5b File:The Handler Blok 6147.png 6 623 981 2025-08-21T21:38:38Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:The Handler Deluge.png 6 624 982 2025-08-21T21:39:01Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:The Handler Asylum.png 6 625 983 2025-08-21T21:39:21Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:The Handler Upper Blocks.png 6 626 984 2025-08-21T21:39:40Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:The Handler Machinarium.png 6 627 985 2025-08-21T21:39:54Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Homunculus Mirage.png 6 628 986 2025-08-21T21:47:54Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Homunculus }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Homunculus }} == Licensing == {{License|game}} fc5c2ddb9ea822503dfa3596a0a0b4ff213f9f3d File:Homunculus Mirage Husk.png 6 629 987 2025-08-21T21:48:41Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Homunculus1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Homunculus1 }} == Licensing == {{License|game}} fdcc48c10fce6b059573bc3c191c38246a9d4540 File:Ability Splinter.png 6 630 988 2025-08-21T22:07:29Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_99 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_99 }} == Licensing == {{License|game}} cc3d774105f02e18a0268d993eff4a288bbde91a File:Upgrade Splinter.png 6 631 989 2025-08-21T22:12:53Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_64 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_64 }} == Licensing == {{License|game}} f7a6b20cf9ed043950eee055a324323c91f45780 File:Upgrade Module.png 6 632 990 2025-08-21T22:13:33Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/ClassicRunes_66 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/ClassicRunes_66 }} == Licensing == {{License|game}} 06698d20f8bdb3e2489af2ec0362c661b1e82459 File:Handler Echo.png 6 633 991 2025-08-21T22:34:45Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/key__3_1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/key__3_1 }} == Licensing == {{License|game}} 8faf7726b0945dd94b058d357fc1f997c9c568d9 File:Old Key.png 6 634 992 2025-08-21T22:35:49Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/Icon_OldKey }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/Icon_OldKey }} == Licensing == {{License|game}} 8dbd7a91e88980a16aa92acffed1f18d078d42db File:Twinblade.png 6 635 993 2025-08-21T22:38:09Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Twinblade }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Twinblade }} == Licensing == {{License|game}} f57b3438161ddfe6622c37effca2b63099b4ac31 File:Blades of Atropos.png 6 636 994 2025-08-21T22:39:05Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Atropos }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Atropos }} == Licensing == {{License|game}} d6861ba34bbb0c868dacbf1a87e03d9d7c07f176 File:Daggers.png 6 637 995 2025-08-21T22:39:45Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Daggers1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Daggers1 }} == Licensing == {{License|game}} e7218b6cb1ed21937cd637c65a60bb67bccdca55 File:Kamas.png 6 638 996 2025-08-21T22:40:25Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Kama }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Kama }} == Licensing == {{License|game}} 5b145fc525755a6a2f4bbfd78888039f5348c836 File:Khopeshs.png 6 639 997 2025-08-21T22:41:05Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Khopesh }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Khopesh }} == Licensing == {{License|game}} 510571eda0c8cb67da332a8d77a80876aee87923 File:Lacerators.png 6 640 998 2025-08-21T22:41:40Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Lacerator }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Lacerator }} == Licensing == {{License|game}} 5362b7aa8a461a6f084269e5182de957f385a43f File:Divine Greataxe.png 6 641 999 2025-08-21T22:42:16Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_DivineGreataxe }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_DivineGreataxe }} == Licensing == {{License|game}} 00f73c265cad1832e38da340f48f82cc61c4ec8a File:Paladin Mace.png 6 642 1000 2025-08-21T22:43:14Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_PaladinHammer }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_PaladinHammer }} == Licensing == {{License|game}} fd301ddc685577d335bd1a27f591cbcadbd7ca5b File:Scimitar.png 6 643 1001 2025-08-21T22:43:48Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar }} 3aad4afb94525075ea36eb0555e0637f33d1228d 1002 1001 2025-08-21T22:44:14Z Sharparam 284703 Add license wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Scimitar }} == Licensing == {{License|game}} bef934861065d3f24dcb6fdae6d78ffdc5ecff1f File:Anastasia.png 6 644 1003 2025-08-21T22:44:57Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Anastasia }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Anastasia }} == Licensing == {{License|game}} 132c2e9a61717db76ba25f12bb83d2614fbe4c15 File:Nodachi.png 6 645 1004 2025-08-21T22:45:35Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Nodachi }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Nodachi }} == Licensing == {{License|game}} 1905a4e62612e5745b6ed0facd953984c0559869 File:Royal Claymore.png 6 646 1005 2025-08-21T22:46:14Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_RoyalClaymore }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_RoyalClaymore }} == Licensing == {{License|game}} 039ef7deb84016626039991c1b0c99d2a268ef41 Royal Claymore 0 503 1006 771 2025-08-21T22:46:48Z Sharparam 284703 Add note about normal [[Claymore]] wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Royal Claymore.png | Type = Two-handed | Damage type = Sharp | Speed = Slow | Abilities = Claymore Swing, Sword Strike | Mk3_Damage_min = 315 | Mk3_Damage_max = 344 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|-9938|7939|-1340}} Found in [[Desert|the Desert]]. Starting where the [[Shifting Sands]] data log can be found, climb up the stairs on either side and walk through the arch. The item can be seen across a gap. Do a jump while sprinting to cross the gap and reach the item. == See also == * [[Claymore]] – The normal version of the weapon. {{Navbox/Weapons}} 811d68f1793d05b574f32314fb8c2e0fd7382058 File:Soul Reaper.png 6 647 1007 2025-08-21T22:47:25Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Soulreaper }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Soulreaper }} == Licensing == {{License|game}} 2aaba316c56f0b5b2cdbf0449fd1c2c26a85906a File:Valtiel.png 6 648 1008 2025-08-21T22:47:56Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Valtiel }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Valtiel }} == Licensing == {{License|game}} 107c0ec41d9dbd5a274cb131e01ae7d9cf000c40 File:Arcane Bow.png 6 649 1009 2025-08-21T22:48:31Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArcaneBow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArcaneBow }} == Licensing == {{License|game}} 9db94b2b997e955748afee80df0be40529fc81a5 File:Taskmaster.png 6 650 1010 2025-08-21T22:49:05Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Taskmaster }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Taskmaster }} == Licensing == {{License|game}} b3bc57a59bcfa9e63f5e6e5695f456d2491bec54 File:Asklepios.png 6 651 1011 2025-08-21T22:49:39Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Asklepios }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Asklepios }} == Licensing == {{License|game}} 301ba27e8025b499157739bb8d92fa4aaa4381fb File:Blessed Crosier.png 6 652 1012 2025-08-21T22:50:19Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Crosier }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Crosier }} == Licensing == {{License|game}} 105800c0a6a3bbaa9b74f85cce69844db316613e File:Vermillion Staff.png 6 653 1013 2025-08-21T22:50:49Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_VermillionStaff }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_VermillionStaff }} == Licensing == {{License|game}} ed8025b89564e7e52c655ea6ef1b33da408b557b Twinblades 0 654 1014 2025-08-21T22:51:18Z Sharparam 284703 Created page with "'''Twinblades''' are a type of [[Weapons|weapon]] in {{BFF}}. [[Category:Twinblades]]" wikitext text/x-wiki '''Twinblades''' are a type of [[Weapons|weapon]] in {{BFF}}. [[Category:Twinblades]] 6cf4c13012b9674afbf0c196a84986b92f6c394c Category:Twinblades 14 655 1015 2025-08-21T22:51:46Z Sharparam 284703 Created page with "[[Category:Two-handed weapons]]" wikitext text/x-wiki [[Category:Two-handed weapons]] 797f628182636dd7d53e09a5330ca3c8e98ffe59 Greatweapons 0 656 1016 2025-08-21T22:52:20Z Sharparam 284703 Created page with "'''Greatweapons''' are a type of [[Two-handed weapons|two-handed weapon]] in {{BFF}}. [[Category:Greatweapons]]" wikitext text/x-wiki '''Greatweapons''' are a type of [[Two-handed weapons|two-handed weapon]] in {{BFF}}. [[Category:Greatweapons]] e6ca350d0fb12afe7023946321db37dda9360e39 Category:Greatweapons 14 657 1017 2025-08-21T22:52:32Z Sharparam 284703 Created page with "[[Category:Two-handed weapons]]" wikitext text/x-wiki [[Category:Two-handed weapons]] 797f628182636dd7d53e09a5330ca3c8e98ffe59 Two-handed weapons 0 658 1018 2025-08-21T22:53:14Z Sharparam 284703 Created page with "'''Two-handed weapons''' are a type of [[Weapons|weapon]] in {{BFF}}. As they require wielding with both hands, a [[Shields|shield]] cannot be equipped at the same time. [[Category:Two-handed weapons]]" wikitext text/x-wiki '''Two-handed weapons''' are a type of [[Weapons|weapon]] in {{BFF}}. As they require wielding with both hands, a [[Shields|shield]] cannot be equipped at the same time. [[Category:Two-handed weapons]] ac75a2ff82d7dc4dcc2faff8bb98a7e16898edc2 Ranged weapons 0 659 1019 2025-08-21T22:54:19Z Sharparam 284703 Created page with "'''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance. == Overview == There are two types of ranged weapons, [[longbows]] and [[staves]]. [[Category:Ranged weapons]]" wikitext text/x-wiki '''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance. == Overview == There are two types of ranged weapons, [[longbows]] and [[staves]]. [[Category:Ranged weapons]] 8959093ae31819cb3ccc6a125991241501951913 Longbows 0 660 1020 2025-08-21T22:54:52Z Sharparam 284703 Created page with "'''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available. [[Category:Longbows]]" wikitext text/x-wiki '''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available. [[Category:Longbows]] c497b3be60be0f4b1eca6d7ad8060afc43fe2f21 Staves 0 661 1021 2025-08-21T22:55:21Z Sharparam 284703 Created page with "'''Staves''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. [[Category:Staves]]" wikitext text/x-wiki '''Staves''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. [[Category:Staves]] 8f6d470b45b1575b318b02cf1c263572c30e4e8b Upgrade items 0 662 1022 2025-08-21T22:57:48Z Sharparam 284703 Created page with "'''Upgrade items''' in {{BFF}} can be used to upgrade equipment to higher mark levels. == Overview == There are two upgrade items available. === Upgrade Splinter === {{Main|Upgrade Splinter}} Upgrade splinters are used to upgrade [[equipment]] to Mk 1, 2, and 3. === Upgrade Modules === {{Main|Upgrade Module}} Upgrade modules are used to upgrade equipment to Mk 4 and 5. [[Category:Upgrade items]]" wikitext text/x-wiki '''Upgrade items''' in {{BFF}} can be used to upgrade equipment to higher mark levels. == Overview == There are two upgrade items available. === Upgrade Splinter === {{Main|Upgrade Splinter}} Upgrade splinters are used to upgrade [[equipment]] to Mk 1, 2, and 3. === Upgrade Modules === {{Main|Upgrade Module}} Upgrade modules are used to upgrade equipment to Mk 4 and 5. [[Category:Upgrade items]] cb0f9a551001e3b722320d79fdf946e6eddcf8b6 Template:Navbox/Essential items 10 663 1023 2025-08-21T23:01:04Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Essential items | title = [[Essential items]] | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Essential items | title = [[Essential items]] | list1 = * [[Ability Splinter]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] }}<noinclude>{{Documentation}}</noinclude> 1adce5372339cfa58118bd7b6ed5a8d7f993200d Template:Navbox/Essential items/doc 10 664 1024 2025-08-21T23:01:37Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> a072d936de3f697ea20b212186fc4bf85674e635 Template:Navbox/Items 10 285 1025 323 2025-08-21T23:02:22Z Sharparam 284703 Move essential items to child navbox wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Essential items|Essential]] | list1 = {{Navbox/Essential items|child}} | group2 = [[Anomalous crystals]] | list2 = {{Navbox/Anomalous crystals|child}} | group3 = [[Consumables]] | list3 = {{Navbox/Consumables|child}} | group4 = [[Equipment]] | list4 = {{Navbox/Equipment|child}} | group5 = [[Materials]] | list5 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 69d95ac18f0d9bf0023d12092ad0a5f2ddc9990b Essential items 0 665 1026 2025-08-21T23:02:43Z Sharparam 284703 Created page with "{{Navbox/Essential items}} [[Category:Essential items]]" wikitext text/x-wiki {{Navbox/Essential items}} [[Category:Essential items]] 02ca5641a551e0ead287a697a66ea738ef164267 Mobius Blade 0 666 1027 2025-08-21T23:07:40Z Sharparam 284703 Created page with "{{Infobox/Item | type = essential | image = Mobius Blade.png }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]). {{Navbox/Essential items}}" wikitext text/x-wiki {{Infobox/Item | type = essential | image = Mobius Blade.png }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]). {{Navbox/Essential items}} 4865fb010f21a17b4d993d6f39357d69eadea7b7 File:Mobius Blade.png 6 667 1028 2025-08-21T23:08:26Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_MobiusBlade }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_MobiusBlade }} == Licensing == {{License|game}} 9ef3d7d55709957c049a3375b5b88ae6202d3eb4 File:Folk Cape.png 6 668 1029 2025-08-21T23:40:37Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_FolkCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_FolkCape }} == Licensing == {{License|game}} 1e1acda1f5c3e858a7735b33901fc7a37c770bfa File:Corrupted Cape.png 6 669 1030 2025-08-21T23:41:21Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptedCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptedCape }} == Licensing == {{License|game}} 86ede209dfdff68e916fa5aafb18b559581d91f8 File:Techpriest Cape.png 6 670 1031 2025-08-21T23:44:18Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_HighPriestCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_HighPriestCape }} == Licensing == {{License|game}} 32d01bfc81b007ced7bde3a6456418a748fb4857 Techpriest Cape 0 515 1032 794 2025-08-21T23:44:51Z Sharparam 284703 Add note on internal game file name wikitext text/x-wiki {{Infobox/Cape | image = Techpriest Cape | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left. == Trivia == * "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]]. * The cape is called "HighPriestCape" in the game files. {{Navbox/Capes}} 564e35049b1bb09829bde7aab564b7e15b98d8db 1033 1032 2025-08-21T23:45:34Z Sharparam 284703 Fix image name wikitext text/x-wiki {{Infobox/Cape | image = Techpriest Cape.png | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left. == Trivia == * "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[w:Warhammer 40,000|Warhammer 40,000]]. * The cape is called "HighPriestCape" in the game files. {{Navbox/Capes}} 3222744a93dd1658eafe1d855b99f59e8a1de857 File:Wanderer Cape.png 6 671 1034 2025-08-21T23:46:08Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_WandererCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_WandererCape }} == Licensing == {{License|game}} 59f5d1d11c35ee9a04826ad1f5ff33f51646d7ac File:Librarian Hood.png 6 672 1035 2025-08-21T23:48:51Z Sharparam 284703 {{Game file | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood }} wikitext text/x-wiki == Summary == {{Game file | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood }} == Licensing == {{License|game}} 110860aa292ef66d5f6ed3b6afa7920caee63ee0 1061 1035 2025-08-22T00:23:39Z Sharparam 284703 Fix template name wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryHood }} == Licensing == {{License|game}} bea980a0ea5124ea67512b1dbc156457b8428213 File:Plagued Revenant Helmet.png 6 673 1036 2025-08-21T23:49:28Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_PlaguedRevenantHelmet }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_PlaguedRevenantHelmet }} == Licensing == {{License|game}} adcd5cca12e8cb8758dc92663575b61298d942ac File:Skullface Helmet.png 6 674 1037 2025-08-21T23:50:01Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_Skullface }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_Skullface }} == Licensing == {{License|game}} 13eb7e5ec1d14cf7ea75b4d27004fea01cd10745 File:Techpriest Helmet.png 6 675 1038 2025-08-21T23:50:38Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_Techpriest }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_Techpriest }} == Licensing == {{License|game}} 249ed277fd956d36cddc43935f1f56f08cca9eef File:Citadel Warrior Chest.png 6 676 1039 2025-08-21T23:51:13Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_WarriorCuirass }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_WarriorCuirass }} == Licensing == {{License|game}} 1e4cb45419070142433921a992c177f948e7f846 File:Corrupted Cuirass.png 6 677 1040 2025-08-21T23:51:40Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptChest }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CorruptChest }} == Licensing == {{License|game}} 6af71d11c2d4579dfa923f8f77aaf4a4c087597c File:Librarian Overcoat.png 6 678 1041 2025-08-21T23:52:14Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibrarianChest }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibrarianChest }} == Licensing == {{License|game}} c77e94b8315764c85113e24c9674a1c6c8cf8fda File:Librarian Trousers.png 6 679 1042 2025-08-21T23:52:46Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryPants }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_LibraryPants }} == Licensing == {{License|game}} 7177dd164cc4369689e183b83b300d4e95a07b0f File:Upper Blocks.png 6 680 1043 2025-08-22T00:00:33Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/UpperBlocks }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/UpperBlocks }} == Licensing == {{License|game}} 7cfe449c7d77f4edb4b76116219f67466bf01fa8 File:Rain District (Sewers).png 6 681 1044 2025-08-22T00:01:11Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Sewer }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Sewer }} == Licensing == {{License|game}} 9e5470e55d56bba0e4dad6b63c457a1c08dd0bcb File:Rain District (Center).png 6 682 1045 2025-08-22T00:01:37Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Center }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/RainDistrict_Center }} == Licensing == {{License|game}} 70759fe0eec60d5d0ce99da02d4eaac2cb63203b File:Deluge.png 6 683 1046 2025-08-22T00:02:00Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Deluge }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Deluge }} == Licensing == {{License|game}} cfc96f2e156ae120c5e6bf630617f999bee3d4f9 File:Asylum.png 6 684 1047 2025-08-22T00:02:23Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Asylum }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Asylum }} == Licensing == {{License|game}} 50c6dcfd17601590137c501e8d93f4b61fbd2f45 File:Ghost Town (Floor 13).png 6 685 1048 2025-08-22T00:02:55Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown }} == Licensing == {{License|game}} 0974507d010f1d5de5e3b6affaeb63d6fd4b9fcd File:Ghost Town (Floor 1).png 6 686 1049 2025-08-22T00:03:13Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown_Floor1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/GhostTown_Floor1 }} == Licensing == {{License|game}} 9648988f1c9544e7583148058fc05b32671ea75f File:Machinarium.png 6 687 1050 2025-08-22T00:03:38Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Machinarium }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Machinarium }} == Licensing == {{License|game}} 95d75682881ecf1489569c7a882291ae51becc5c File:Desert.png 6 688 1051 2025-08-22T00:03:59Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Desert }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Desert }} == Licensing == {{License|game}} 233e96a1fc045c10cc5d2580564d904c2a477c26 File:Desert Mirage.png 6 689 1052 2025-08-22T00:04:26Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/DesertMirage }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/DesertMirage }} == Licensing == {{License|game}} 7d227ef4860febfdb792b9c1cc849a3d35a7bb6f File:Anomaly.png 6 690 1053 2025-08-22T00:04:49Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Anomaly }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/Anomaly }} == Licensing == {{License|game}} 26aca621fbecbbfc5a2a8e46e0bb2f3ad61c640e File:Vermillion Fields (Plaza).png 6 691 1054 2025-08-22T00:05:30Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionPlaza }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionPlaza }} == Licensing == {{License|game}} 47f31e8ce34e4bf716aae7924e3d8dbb2fcebdff File:Vermillion Fields (Temple).png 6 692 1055 2025-08-22T00:05:52Z Sharparam 284703 {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionTemple }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Blueprints/HUD/FastTravel/LocationScreens/VermillionTemple }} == Licensing == {{License|game}} 2b5902316fc2a4752f3e3d19b8eba897da81610f File:Statues location.jpg 6 693 1056 2025-08-22T00:08:12Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Crescent Axe.png 6 694 1057 2025-08-22T00:11:06Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_CrescentAxe }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_CrescentAxe }} == Licensing == {{License|game}} e4f60d5d622c5eb43841b4ffc6b32d78ce3cd014 Crescent Axe 0 502 1058 769 2025-08-22T00:11:35Z Sharparam 284703 Add navbox wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Crescent Axe.png | Type = two-handed | Damage type = Sharp | Speed = Slow | Abilities = Expose Armor, Crescent Slash | Mk2_Damage_min = 251 | Mk2_Damage_max = 271 }} == Location == {{coords|-3932|1535|1532}} Located in the room with [[The Banshee]] [[Data logs|data log]]. {{Navbox/Weapons}} a8301762c20f8a07104c5e919cb9fbfceed2e8f5 1060 1058 2025-08-22T00:20:03Z Sharparam 284703 Add description wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Crescent Axe.png | Type = two-handed | Damage type = Sharp | Speed = Slow | Abilities = Expose Armor, Crescent Slash | Mk2_Damage_min = 251 | Mk2_Damage_max = 271 }} '''{{PAGENAME}}''' is a [[Two-handed weapons|two-handed weapon]] in {{BFF}}. == Location == {{coords|-3932|1535|1532}} Located in the room with [[The Banshee]] [[Data logs|data log]]. {{Navbox/Weapons}} 00b81a1c9f4c6b9f1f6a2a0308f9d8036122d562 Template:Navbox/Weapons 10 438 1059 645 2025-08-22T00:12:35Z Sharparam 284703 Add [[Crescent Axe]] wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Crescent Axe]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] | group3 = [[Ranged weapons|Ranged]] | group3.1 = [[Longbows]] | list3.1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] | group3.2 = [[Staves]] | list3.2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 58088fcaffd9bc941436dc381724677f054ceb46 Category:Helmets 14 695 1062 2025-08-22T00:25:01Z Sharparam 284703 Created page with "[[Category:Armor]]" wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Heartbeat 0 388 1063 539 2025-08-22T00:25:42Z Sharparam 284703 Fix category wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] in {{BFF}}. == Overview == {{Quote |Have you ever tried to paint a loved one's face from memory? The image shifts and deforms, highlighting the mind's fleeting nature. Drawing from memory is an abstract skill, breathing and heartbeats are automatic. Now, even these feel abstract to me. I have to consciously breathe and encourage my heart to beat, doubting its rhythm if I can't feel it. My heartbeat feels like as word repeated until it loses meaning. Nothing endures here. }} == Location == {{coords|3326|-6471|-6573}} Found in the [[Monastery#Lower|Monastery (Lower)]]. Starting at the [[Homunculus]], go forward until the end of the roof where the first enemy is, then take the left path that goes down several stairs. Continue into the hallway at the bottom and take a left, then go up the elevator. Go straight and you'll come to a platform with a staircase going up to the right. The data log is right before the staircase. Use [[Scanner|the scanner]] to more easily find it. {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 6b4655eec7f3f3e087d002c3a1281d247e0b0cf2 Category:Legguards 14 696 1064 2025-08-22T00:26:02Z Sharparam 284703 Created page with "[[Category:Armor]]" wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Category:Materials 14 697 1065 2025-08-22T00:26:18Z Sharparam 284703 Created page with "[[Category:Items]]" wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Category:Modules 14 698 1066 2025-08-22T00:26:37Z Sharparam 284703 Created page with "Lua modules." wikitext text/x-wiki Lua modules. 079e82b53167721297f91da34adfc9459140e554 Category:Pages that need coordinates 14 699 1067 2025-08-22T00:27:59Z Sharparam 284703 Created page with "Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template." wikitext text/x-wiki Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template. c583e0f1126353a4444174e9d73b247ae2968254 Skullface Helmet 0 490 1068 745 2025-08-22T00:30:40Z Sharparam 284703 Fix formatting of passives wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Skullface Helmet.png | Type = Helmet | Weight = Light | Passives = Volatile Illusions | Mk5_Sharp = 692 | Mk5_Blunt = 692 | Mk5_Technomancy = 928 }} == Location == {{coords|-4063|1564|1686}} After reaching the room with a big circular elevator in the middle, look around the edges of the room for a bookshelf containing the helmet. {{Navbox/Armor}} d5a1b5a552329e4ac95e57677ce97662ce7115e3 Template:Infobox/Armor 10 453 1069 671 2025-08-22T00:31:55Z Sharparam 284703 Use {{tl:Plainlist}} instead of {{tl:Hlist}} for passives wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helmet = [[Helmet]] | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard = [[Legguard]] | gauntlet = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|[[{{{Set}}}]]}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 87c41b6009da8db75d705c5a2cd72f5ef3ad20d0 Techpriest Helmet 0 491 1070 747 2025-08-22T00:32:35Z Sharparam 284703 Fix passives list wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Techpriest Helmet.png | Type = Helmet | Weight = Light | Passives = Minor Flux Regen | Mk5_Sharp = 722 | Mk5_Blunt = 722 | Mk5_Technomancy = 928 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1272|-8495|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], head through the doorway and take the left path. After reaching the outdoors area, head up the stairs and take a narrow path on the right leading to a small area behind a building with the helmet in a corner. {{Navbox/Armor}} 6bf0cbd27f554dbd5cd936fb46578e34b4b84ae6 Module:Track listing/styles.css 828 414 1071 589 2025-08-22T00:33:18Z Sharparam 284703 Remove unused template sanitized-css text/css .tracklist { border-spacing: 0; } /* set on all rows we can set the total length row to transparent */ .tracklist tr { background-color: var(--background-color-base, #fff); } .tracklist tr:nth-child(2n-1) { background-color: var(--background-color-neutral-subtle, #f8f9fa); } .tracklist caption { text-align: left; font-weight: bold; } .tracklist td, .tracklist th[scope="row"] { vertical-align: top; } .tracklist th[scope="col"] { text-align: left; background-color: var(--background-color-neutral, #eaecf0); } .tracklist th.tracklist-length-header, .tracklist th.tracklist-number-header, .tracklist th[scope="row"], .tracklist-length, .tracklist-total-length td { padding-right: 10px; text-align: right; } .tracklist th[scope="row"] { font-weight: normal; } .tracklist-number-header { width: 2em; padding-left: 10px; } .tracklist-length-header { width: 4em; } .tracklist tr.tracklist-total-length { background-color: transparent; } .tracklist .tracklist-total-length th { padding: 0; font-weight: bold; } .tracklist-total-length th > span { float: right; padding: 0 10px; background-color: var(--background-color-neutral, #eaecf0); } .tracklist-total-length td { background-color: var(--background-color-neutral, #eaecf0); font-weight: bold; padding: 0 10px 0 0; } f8262e857e4655dfadbdb5ad31f192ca96a267be Module:Hatnote/styles.css 828 415 1072 590 2025-08-22T00:33:37Z Sharparam 284703 Remove unused template sanitized-css text/css .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } @media print { body.ns-0 .hatnote { display: none !important; } } eacdbf0b74568c1efba92340368f477c45b286e6 Template:Order of magnitude 10 700 1073 2025-08-22T00:35:53Z Sharparam 284703 Created page with "<includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0 |{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1 |0 |{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}} }} |{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}} }}</includeonly><noinclude> {{documentation}} </noinclude>" wikitext text/x-wiki <includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0 |{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1 |0 |{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}} }} |{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}} }}</includeonly><noinclude> {{documentation}} </noinclude> cede5694e8ebb404ecdd17ae1f8e1c5d19562728 Module:Sortkey 828 701 1074 2025-08-22T00:36:58Z Sharparam 284703 Created page with "local getArgs = require('Module:Arguments').getArgs local p = {} function p._encode(sortkey) -- Protect against sortkey nesting. -- Example: {{sort|{{dts|2013|07|07}}|{{dts|1990|12|01}}}} if string.find(sortkey, "sortkey") or string.find(sortkey, "data-sort-value") then return ""; end return mw.text.encode(sortkey) end function p.encode(frame) local args = getArgs(frame); return p._encode(args[1] or "") end local function valid_number(num) -- Return true..." Scribunto text/plain local getArgs = require('Module:Arguments').getArgs local p = {} function p._encode(sortkey) -- Protect against sortkey nesting. -- Example: {{sort|{{dts|2013|07|07}}|{{dts|1990|12|01}}}} if string.find(sortkey, "sortkey") or string.find(sortkey, "data-sort-value") then return ""; end return mw.text.encode(sortkey) end function p.encode(frame) local args = getArgs(frame); return p._encode(args[1] or "") end local function valid_number(num) -- Return true if num is a valid number. -- In Scribunto (different from some standard Lua), when expressed as a string, -- overflow or other problems are indicated with text like "inf" or "nan" -- which are regarded as invalid here (each contains "n"). if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then return true end end function p._sortKeyForNumber(value) local sortkey if not valid_number(value) then if value < 0 then sortkey = '1000000000000000000' else sortkey = '9000000000000000000' end elseif value == 0 then sortkey = '5000000000000000000' else local mag = math.floor(math.log10(math.abs(value)) + 1e-14) local prefix if value > 0 then prefix = 7000 + mag else prefix = 2999 - mag value = value + 10^(mag+1) end sortkey = string.format('%d', prefix) .. string.format('%015.0f', math.floor(value * 10^(math.min(28,14-mag)))) end return sortkey; end function p.sortKeyForNumber(frame) local args = getArgs(frame); return p._sortKeyForNumber(args[1] or "") end return p 61c7b121abc7df4d9f0cab5456de8cb0de4ed1e2 Template:Hidden sort key 10 702 1075 2025-08-22T00:37:33Z Sharparam 284703 Created page with "<span data-sort-value="{{#invoke:sortkey|encode|{{{1}}}}}" style="display:none;"></span><noinclude> {{Documentation}} </noinclude>" wikitext text/x-wiki <span data-sort-value="{{#invoke:sortkey|encode|{{{1}}}}}" style="display:none;"></span><noinclude> {{Documentation}} </noinclude> 90e59249d00fc722efaf114ab4f6d3c2edcf640c Template:Hid 10 703 1076 2025-08-22T00:37:50Z Sharparam 284703 Redirected page to [[Template:Hidden sort key]] wikitext text/x-wiki #REDIRECT [[Template:Hidden sort key]] 3c894cab38ac0a316503172fe1f0de434c40bae8 Template:Round 10 704 1077 2025-08-22T00:37:59Z Sharparam 284703 Created page with "<includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} | {{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!-- -->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}| {{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude> {{documentation}} </noinclude>" wikitext text/x-wiki <includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} | {{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!-- -->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}| {{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude> {{documentation}} </noinclude> 9c2874586b74824fe1beb6830b56eabe7ad936ce Template:Median 10 705 1078 2025-08-22T00:38:36Z Sharparam 284703 Created page with "{{#invoke:math|median}} <noinclude>{{doc}}</noinclude>" wikitext text/x-wiki {{#invoke:math|median}} <noinclude>{{doc}}</noinclude> 57105bd7f84192a6b93c460a09f4acb9700dfd24 Template:Median/doc 10 706 1079 2025-08-22T00:39:07Z Sharparam 284703 Created page with "This template is used to find the median of a series of numbers. {{clear}} ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|..." wikitext text/x-wiki This template is used to find the median of a series of numbers. {{clear}} ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10.1|20.1|30.1|50.1|1000.1}}</syntaxhighlight> → {{Median|20.1|10.1|30.1|50.1|1000.1}} ==See also== *{{tl|Average}} 6f5fe5da1f5a16fe5f485990dc980ccd555dfac7 Level 0 707 1081 1080 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''' is a measure of a player's experience. == Overview == The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects. The amount of experience points required to reach further levels will regularly increase, although not with every level. Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2. The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]]. {| class="wikitable sticky-header hover-highlight" style="text-align: right;" |- ! scope="col" | Level ! scope="col" | EXP to next ! scope="col" | Cost increase ! scope="col" | Total EXP |- | 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} |- | 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} |- | 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} |- | 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} |- | 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} |- | 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} |- | 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} |- | 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} |- | 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} |- | 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} |- | 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} |- | 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} |- | 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} |- | 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} |- | 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} |- | 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} |- | 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} |- | 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} |- | 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} |- | 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} |- | 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} |- | 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} |- | 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} |- | 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} |- | 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} |- | 25 || ??? || ??? || {{fnum|430950}} |} [[Category:Game mechanics]] 2d60aff79f3c19820de1c03f6ed887e247b40df6 1096 1081 2025-08-22T00:48:51Z Sharparam 284703 /* Overview */ Update level table wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''' is a measure of a player's experience. == Overview == The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects. The amount of experience points required to reach further levels will regularly increase, although not with every level. Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2. The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]]. {| class="wikitable sticky-header hover-highlight" style="text-align: right;" |- ! scope="col" | Level ! scope="col" | EXP to next ! scope="col" | Cost increase ! scope="col" | Total EXP ! scope="col" | Attribute points ! scope="col" | Total attr points |- | 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} || 0 || 0 |- | 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} || 2 || 2 |- | 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} || 2 || 4 |- | 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} || 2 || 6 |- | 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} || 2 || 8 |- | 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} || 4 || 12 |- | 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} || 2 || 14 |- | 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} || 2 || 16 |- | 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} || 2 || 18 |- | 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} || 2 || 20 |- | 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} || 4 || 24 |- | 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} || 2 || 26 |- | 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} || 2 || 28 |- | 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} || 2 || 30 |- | 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} || 2 || 32 |- | 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} || 4 || 36 |- | 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} || 2 || 38 |- | 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} || 2 || 40 |- | 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} || 2 || 42 |- | 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} || 2 || 44 |- | 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} || 4 || 48 |- | 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} || 2 || 50 |- | 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} || 2 || 52 |- | 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} || 2 || 54 |- | 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} || 2 || 56 |- | 25 || {{fnum|103420}} || {{fnum|78420}} || {{fnum|430950}} || 6 || 62 |- | 26 || {{fnum|103430}} || {{fnum|10}} || {{fnum|534370}} || 3 || 65 |- | 27 || {{fnum|103430}} || {{fnum|0}} || {{fnum|637800}} || 3 || 68 |- | 28 || {{fnum|103430}} || {{fnum|0}} || {{fnum|741230}} || 3 || 71 |- | 29 || {{fnum|103430}} || {{fnum|0}} || {{fnum|844660}} || 3 || 74 |} [[Category:Game mechanics]] 836d770a69e5b4fe2126732e89aea01c3ac6074e Category:Attributes 14 708 1083 1082 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[Category:Game mechanics]] f2739a7f6d15068b5f220f8cbb0a1aa293521862 Entropy 0 709 1085 1084 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is a property of the player in {{BFF}}. == Overview == Entropy can only be gained from a few sources. * Dying to a [[Vermillion Knight]] increases entropy by 0.25%. * Dying during phase 2 of the [[Royal Division Captain Yulia & Vermillion Mirage]] boss fight (after Yulia joins the fight) increases entropy by 0.5%. Upon reaching 100% entropy, the player's save file is deleted. [[Category:Game mechanics]] cda5c4f1fca74bd5447670462ba15ebe07df0b38 Strength 0 710 1087 1086 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects weapon damage and max weight. == Overview == Strength affects bonus weapon damage, as well as the max weight which affects encumbrance. The gain to max weight is {{val|450|u=g}} for every attribute point until 45, which is the last to give the increment. Every additional level into strength after that will not increase max weight, so it has a hard cap of {{val|40.5|u=kg}}. The gain to bonus weapon damage is always 10.8%, but going past 92 shows the total bonus damage as always being 1%. It is unclear if this is just a visual bug or if the bonus damage actually does drop down to 1%. {| class="wikitable sortable hover-highlight sticky-header-multi mw-collapsible mw-collapsed" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Strength ! class="unsortable" scope="col" rowspan="2" | +Weapon DMG ! class="unsortable" scope="col" rowspan="2" | Max weight (g) ! class="unsortable" scope="col" colspan="2" | Increments |- ! class="unsortable" scope="col" | +Weapon DMG ! class="unsortable" scope="col" | Max weight (g) |- | 0 || 0.0% || {{fnum|20250}} || 0.0% || 0 |- | 1 || 10.8% || {{fnum|20700}} || 10.8% || 450 |- | 2 || 21.6% || {{fnum|21150}} || 10.8% || 450 |- | 3 || 32.4% || {{fnum|21600}} || 10.8% || 450 |- | 4 || 43.2% || {{fnum|22050}} || 10.8% || 450 |- | 5 || 54.0% || {{fnum|22500}} || 10.8% || 450 |- | 6 || 64.8% || {{fnum|22950}} || 10.8% || 450 |- | 7 || 75.6% || {{fnum|23400}} || 10.8% || 450 |- | 8 || 86.4% || {{fnum|23850}} || 10.8% || 450 |- | 9 || 97.2% || {{fnum|24300}} || 10.8% || 450 |- | 10 || 108.0% || {{fnum|24750}} || 10.8% || 450 |- | 11 || 118.8% || {{fnum|25200}} || 10.8% || 450 |- | 12 || 129.6% || {{fnum|25650}} || 10.8% || 450 |- | 13 || 140.4% || {{fnum|26100}} || 10.8% || 450 |- | 14 || 151.2% || {{fnum|26550}} || 10.8% || 450 |- | 15 || 162.0% || {{fnum|27000}} || 10.8% || 450 |- | 16 || 172.8% || {{fnum|27450}} || 10.8% || 450 |- | 17 || 183.6% || {{fnum|27900}} || 10.8% || 450 |- | 18 || 194.4% || {{fnum|28350}} || 10.8% || 450 |- | 19 || 205.2% || {{fnum|28800}} || 10.8% || 450 |- | 20 || 216.0% || {{fnum|29250}} || 10.8% || 450 |- | 21 || 226.8% || {{fnum|29700}} || 10.8% || 450 |- | 22 || 237.6% || {{fnum|30150}} || 10.8% || 450 |- | 23 || 248.4% || {{fnum|30600}} || 10.8% || 450 |- | 24 || 259.2% || {{fnum|31050}} || 10.8% || 450 |- | 25 || 270.0% || {{fnum|31500}} || 10.8% || 450 |- | 26 || 280.8% || {{fnum|31950}} || 10.8% || 450 |- | 27 || 291.6% || {{fnum|32400}} || 10.8% || 450 |- | 28 || 302.4% || {{fnum|32850}} || 10.8% || 450 |- | 29 || 313.2% || {{fnum|33300}} || 10.8% || 450 |- | 30 || 324.0% || {{fnum|33750}} || 10.8% || 450 |- | 31 || 334.8% || {{fnum|34200}} || 10.8% || 450 |- | 32 || 345.6% || {{fnum|34650}} || 10.8% || 450 |- | 33 || 356.4% || {{fnum|35100}} || 10.8% || 450 |- | 34 || 367.2% || {{fnum|35550}} || 10.8% || 450 |- | 35 || 378.0% || {{fnum|36000}} || 10.8% || 450 |- | 36 || 388.8% || {{fnum|36450}} || 10.8% || 450 |- | 37 || 399.6% || {{fnum|36900}} || 10.8% || 450 |- | 38 || 410.4% || {{fnum|37350}} || 10.8% || 450 |- | 39 || 421.2% || {{fnum|37800}} || 10.8% || 450 |- | 40 || 432.0% || {{fnum|38250}} || 10.8% || 450 |- | 41 || 442.8% || {{fnum|38700}} || 10.8% || 450 |- | 42 || 453.6% || {{fnum|39150}} || 10.8% || 450 |- | 43 || 464.4% || {{fnum|39600}} || 10.8% || 450 |- | 44 || 475.2% || {{fnum|40050}} || 10.8% || 450 |- | 45 || 486.0% || {{fnum|40500}} || 10.8% || 450 |- | 46 || 496.8% || {{fnum|40500}} || 10.8% || 0 |- | 47 || 507.6% || {{fnum|40500}} || 10.8% || 0 |- | 48 || 518.4% || {{fnum|40500}} || 10.8% || 0 |- | 49 || 529.2% || {{fnum|40500}} || 10.8% || 0 |- | 50 || 540.0% || {{fnum|40500}} || 10.8% || 0 |- | 51 || 550.8% || {{fnum|40500}} || 10.8% || 0 |- | 52 || 561.6% || {{fnum|40500}} || 10.8% || 0 |- | 53 || 572.4% || {{fnum|40500}} || 10.8% || 0 |- | 54 || 583.2% || {{fnum|40500}} || 10.8% || 0 |- | 55 || 594.0% || {{fnum|40500}} || 10.8% || 0 |- | 56 || 604.8% || {{fnum|40500}} || 10.8% || 0 |- | 57 || 615.6% || {{fnum|40500}} || 10.8% || 0 |- | 58 || 626.4% || {{fnum|40500}} || 10.8% || 0 |- | 59 || 637.2% || {{fnum|40500}} || 10.8% || 0 |- | 60 || 648.0% || {{fnum|40500}} || 10.8% || 0 |- | 61 || 658.8% || {{fnum|40500}} || 10.8% || 0 |- | 62 || 669.6% || {{fnum|40500}} || 10.8% || 0 |- | 63 || 680.4% || {{fnum|40500}} || 10.8% || 0 |- | 64 || 691.2% || {{fnum|40500}} || 10.8% || 0 |- | 65 || 702.0% || {{fnum|40500}} || 10.8% || 0 |- | 66 || 712.8% || {{fnum|40500}} || 10.8% || 0 |- | 67 || 723.6% || {{fnum|40500}} || 10.8% || 0 |- | 68 || 734.4% || {{fnum|40500}} || 10.8% || 0 |- | 69 || 745.2% || {{fnum|40500}} || 10.8% || 0 |- | 70 || 756.0% || {{fnum|40500}} || 10.8% || 0 |- | 71 || 766.8% || {{fnum|40500}} || 10.8% || 0 |- | 72 || 777.6% || {{fnum|40500}} || 10.8% || 0 |- | 73 || 788.4% || {{fnum|40500}} || 10.8% || 0 |- | 74 || 799.2% || {{fnum|40500}} || 10.8% || 0 |- | 75 || 810.0% || {{fnum|40500}} || 10.8% || 0 |- | 76 || 820.8% || {{fnum|40500}} || 10.8% || 0 |- | 77 || 831.6% || {{fnum|40500}} || 10.8% || 0 |- | 78 || 842.4% || {{fnum|40500}} || 10.8% || 0 |- | 79 || 853.2% || {{fnum|40500}} || 10.8% || 0 |- | 80 || 864.0% || {{fnum|40500}} || 10.8% || 0 |- | 81 || 874.8% || {{fnum|40500}} || 10.8% || 0 |- | 82 || 885.6% || {{fnum|40500}} || 10.8% || 0 |- | 83 || 896.4% || {{fnum|40500}} || 10.8% || 0 |- | 84 || 907.2% || {{fnum|40500}} || 10.8% || 0 |- | 85 || 918.0% || {{fnum|40500}} || 10.8% || 0 |- | 86 || 928.8% || {{fnum|40500}} || 10.8% || 0 |- | 87 || 939.6% || {{fnum|40500}} || 10.8% || 0 |- | 88 || 950.4% || {{fnum|40500}} || 10.8% || 0 |- | 89 || 961.2% || {{fnum|40500}} || 10.8% || 0 |- | 90 || 972.0% || {{fnum|40500}} || 10.8% || 0 |- | 91 || 982.8% || {{fnum|40500}} || 10.8% || 0 |- | 92 || 993.6% || {{fnum|40500}} || 10.8% || 0 |} [[Category:Attributes]] acf936b03bf018cd91d4c8f8790137535cf71c2d Agility 0 711 1089 1088 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects stats related to critical chance, stamina, speed, and boss resistance to arrows. == Overview == Critical chance and melee swing speed both have a hard cap at 100. The hard caps for other stats can be seen in the table when their increment amount drops to zero. <!--<div class="noresize">--> {| class="wikitable hover-highlight mw-collapsible mw-collapsed sortable sticky-header-multi" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Agility ! class="unsortable" scope="col" rowspan="2" | Crit chance ! class="unsortable" scope="col" rowspan="2" | Stamina ! class="unsortable" scope="col" rowspan="2" | Stam delay ! class="unsortable" scope="col" rowspan="2" | Move speed ! class="unsortable" scope="col" rowspan="2" | Melee swing speed ! class="unsortable" scope="col" rowspan="2" | Range wep draw spd pen ! class="unsortable" scope="col" rowspan="2" | Boss arrow res reduction ! class="unsortable" scope="col" colspan="7" | Increments |- ! class="unsortable" scope="col" | Crit chance ! class="unsortable" scope="col" | Stamina ! class="unsortable" scope="col" | Stam delay ! class="unsortable" scope="col" | Move speed ! class="unsortable" scope="col" | Melee swing speed ! class="unsortable" scope="col" | Range wep draw spd pen ! class="unsortable" scope="col" | Boss arrow res reduction |- | 0 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 25.00% || 0% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 0.00% || 0% |- | 1 || 0.00% || 105 || 1.90 || 100.00% || 100.0% || 23.89% || 1% || 0.00% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 2 || 0.25% || 105 || 1.90 || 100.00% || 100.0% || 22.78% || 2% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 3 || 0.50% || 105 || 1.90 || 100.00% || 100.0% || 21.67% || 3% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 4 || 0.75% || 105 || 1.90 || 100.00% || 100.0% || 20.56% || 4% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 5 || 1.00% || 105 || 1.90 || 100.00% || 100.0% || 19.45% || 5% || 0.25% || 0 || 0.00 || 0.00% || 0.0% || 1.11% || 1% |- | 6 || 1.50% || 107 || 1.89 || 100.00% || 100.0% || 18.34% || 6% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 7 || 2.00% || 109 || 1.88 || 100.00% || 100.0% || 17.23% || 7% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 8 || 2.50% || 111 || 1.87 || 100.00% || 100.0% || 16.12% || 8% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 9 || 3.00% || 113 || 1.86 || 100.00% || 100.0% || 15.01% || 9% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 10 || 3.50% || 115 || 1.85 || 100.00% || 100.0% || 13.90% || 10% || 0.50% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 11 || 4.10% || 117 || 1.84 || 100.00% || 100.0% || 12.79% || 11% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 12 || 4.70% || 119 || 1.83 || 100.00% || 100.0% || 11.68% || 12% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 13 || 5.30% || 121 || 1.82 || 100.00% || 100.0% || 10.57% || 13% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 14 || 5.90% || 123 || 1.81 || 100.00% || 100.0% || 9.46% || 14% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 15 || 6.50% || 125 || 1.80 || 100.00% || 100.0% || 8.35% || 15% || 0.60% || 2 || 0.01 || 0.00% || 0.0% || 1.11% || 1% |- | 16 || 9.07% || 127 || 1.79 || 100.17% || 100.5% || 7.24% || 16% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 17 || 11.64% || 129 || 1.78 || 100.34% || 101.0% || 6.13% || 17% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 18 || 14.21% || 131 || 1.77 || 100.51% || 101.5% || 5.02% || 18% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 19 || 16.78% || 133 || 1.76 || 100.68% || 102.0% || 3.91% || 19% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 20 || 19.35% || 135 || 1.75 || 100.85% || 102.5% || 2.80% || 20% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 21 || 21.92% || 137 || 1.74 || 101.02% || 103.0% || 1.69% || 21% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 22 || 24.49% || 139 || 1.73 || 101.19% || 103.5% || 0.58% || 22% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 23 || 27.06% || 141 || 1.72 || 101.36% || 104.0% || -0.53% || 23% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 24 || 29.63% || 143 || 1.71 || 101.53% || 104.5% || -1.64% || 24% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 25 || 32.20% || 145 || 1.70 || 101.70% || 105.0% || -2.75% || 25% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 26 || 34.77% || 147 || 1.69 || 101.87% || 105.5% || -3.86% || 26% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 27 || 37.34% || 149 || 1.68 || 102.04% || 106.0% || -4.97% || 27% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 28 || 39.91% || 151 || 1.67 || 102.21% || 106.5% || -6.08% || 28% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 29 || 42.48% || 153 || 1.66 || 102.38% || 107.0% || -7.19% || 29% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 30 || 45.05% || 155 || 1.65 || 102.55% || 107.5% || -8.30% || 30% || 2.57% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 31 || 46.05% || 157 || 1.64 || 102.72% || 108.0% || -9.41% || 31% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 32 || 47.05% || 159 || 1.63 || 102.89% || 108.5% || -10.52% || 32% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 33 || 48.05% || 161 || 1.62 || 103.06% || 109.0% || -11.63% || 33% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 34 || 49.05% || 163 || 1.61 || 103.23% || 109.5% || -12.74% || 34% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 35 || 50.05% || 165 || 1.60 || 103.40% || 110.0% || -13.85% || 35% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 36 || 51.05% || 167 || 1.59 || 103.57% || 110.5% || -14.96% || 36% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 37 || 52.05% || 169 || 1.58 || 103.74% || 111.0% || -16.07% || 37% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 38 || 53.05% || 171 || 1.57 || 103.91% || 111.5% || -17.18% || 38% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 39 || 54.05% || 173 || 1.56 || 104.08% || 112.0% || -18.29% || 39% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 40 || 55.05% || 175 || 1.55 || 104.25% || 112.5% || -19.40% || 40% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 41 || 56.05% || 177 || 1.54 || 104.42% || 113.0% || -20.51% || 41% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 42 || 57.05% || 179 || 1.53 || 104.59% || 113.5% || -21.62% || 42% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 43 || 58.05% || 181 || 1.52 || 104.76% || 114.0% || -22.73% || 43% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 44 || 59.05% || 183 || 1.51 || 104.93% || 114.5% || -23.84% || 44% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 45 || 60.05% || 185 || 1.50 || 105.10% || 115.0% || -24.95% || 45% || 1.00% || 2 || 0.01 || 0.17% || 0.5% || 1.11% || 1% |- | 46 || 61.05% || 186 || 1.50 || 105.24% || 115.5% || -24.95% || 46% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 47 || 62.05% || 187 || 1.50 || 105.38% || 116.0% || -24.95% || 47% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 48 || 63.05% || 188 || 1.50 || 105.52% || 116.5% || -24.95% || 48% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 49 || 64.05% || 189 || 1.50 || 105.66% || 117.0% || -24.95% || 49% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 50 || 65.05% || 190 || 1.50 || 105.80% || 117.5% || -24.95% || 50% || 1.00% || 1 || 0.00 || 0.14% || 0.5% || 0.00% || 1% |- | 51 || 65.45% || 191 || 1.50 || 105.94% || 117.7% || -24.95% || 51% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 52 || 65.85% || 192 || 1.50 || 106.08% || 117.9% || -24.95% || 52% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 53 || 66.25% || 193 || 1.50 || 106.22% || 118.1% || -24.95% || 53% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 54 || 66.65% || 194 || 1.50 || 106.36% || 118.3% || -24.95% || 54% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 55 || 67.05% || 195 || 1.50 || 106.50% || 118.5% || -24.95% || 55% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 56 || 67.45% || 196 || 1.50 || 106.64% || 118.7% || -24.95% || 56% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 57 || 67.85% || 197 || 1.50 || 106.78% || 118.9% || -24.95% || 57% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 58 || 68.25% || 198 || 1.50 || 106.92% || 119.1% || -24.95% || 58% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 59 || 68.65% || 199 || 1.50 || 107.06% || 119.3% || -24.95% || 59% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 60 || 69.05% || 200 || 1.50 || 107.20% || 119.5% || -24.95% || 60% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 61 || 69.45% || 201 || 1.50 || 107.34% || 119.7% || -24.95% || 61% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 62 || 69.85% || 202 || 1.50 || 107.48% || 119.9% || -24.95% || 62% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 63 || 70.25% || 203 || 1.50 || 107.62% || 120.1% || -24.95% || 63% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 64 || 70.65% || 204 || 1.50 || 107.76% || 120.3% || -24.95% || 64% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 65 || 71.05% || 205 || 1.50 || 107.90% || 120.5% || -24.95% || 65% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 66 || 71.45% || 206 || 1.50 || 108.04% || 120.7% || -24.95% || 66% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 67 || 71.85% || 207 || 1.50 || 108.18% || 120.9% || -24.95% || 67% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 68 || 72.25% || 208 || 1.50 || 108.32% || 121.1% || -24.95% || 68% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 69 || 72.65% || 209 || 1.50 || 108.46% || 121.3% || -24.95% || 69% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 70 || 73.05% || 210 || 1.50 || 108.60% || 121.5% || -24.95% || 70% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 71 || 73.45% || 211 || 1.50 || 108.74% || 121.7% || -24.95% || 71% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 72 || 73.85% || 212 || 1.50 || 108.88% || 121.9% || -24.95% || 72% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 73 || 74.25% || 213 || 1.50 || 109.02% || 122.1% || -24.95% || 73% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 74 || 74.65% || 214 || 1.50 || 109.16% || 122.3% || -24.95% || 74% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 75 || 75.05% || 215 || 1.50 || 109.30% || 122.5% || -24.95% || 75% || 0.40% || 1 || 0.00 || 0.14% || 0.2% || 0.00% || 1% |- | 76 || 75.25% || 216 || 1.50 || 109.44% || 122.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 77 || 75.45% || 217 || 1.50 || 109.58% || 122.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 78 || 75.65% || 218 || 1.50 || 109.72% || 122.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 79 || 75.85% || 219 || 1.50 || 109.86% || 122.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 80 || 76.05% || 220 || 1.50 || 110.00% || 123.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.14% || 0.1% || 0.00% || 0% |- | 81 || 76.25% || 221 || 1.50 || 110.00% || 123.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 82 || 76.45% || 222 || 1.50 || 110.00% || 123.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 83 || 76.65% || 223 || 1.50 || 110.00% || 123.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 84 || 76.85% || 224 || 1.50 || 110.00% || 123.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 85 || 77.05% || 225 || 1.50 || 110.00% || 123.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 86 || 77.25% || 226 || 1.50 || 110.00% || 123.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 87 || 77.45% || 227 || 1.50 || 110.00% || 123.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 88 || 77.65% || 228 || 1.50 || 110.00% || 123.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 89 || 77.85% || 229 || 1.50 || 110.00% || 123.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 90 || 78.05% || 230 || 1.50 || 110.00% || 124.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 91 || 78.25% || 231 || 1.50 || 110.00% || 124.1% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 92 || 78.45% || 232 || 1.50 || 110.00% || 124.2% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 93 || 78.65% || 233 || 1.50 || 110.00% || 124.3% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 94 || 78.85% || 234 || 1.50 || 110.00% || 124.4% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 95 || 79.05% || 235 || 1.50 || 110.00% || 124.5% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 96 || 79.25% || 236 || 1.50 || 110.00% || 124.6% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 97 || 79.45% || 237 || 1.50 || 110.00% || 124.7% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 98 || 79.65% || 238 || 1.50 || 110.00% || 124.8% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 99 || 79.85% || 239 || 1.50 || 110.00% || 124.9% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |- | 100 || 80.05% || 240 || 1.50 || 110.00% || 125.0% || -24.95% || 75% || 0.20% || 1 || 0.00 || 0.00% || 0.1% || 0.00% || 0% |} <!--</div>--> [[Category:Attributes]] 7a701b76e512860658a8b6ad71e4474cbf3409ce Attributes 0 712 1091 1090 2025-08-22T00:43:08Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' determine the player's [[stats]]. == Overview == Each time the player [[Level|levels up]], they get two points to spend on one of the four attributes. == Strength == {{main|Strength}} == Agility == {{main|Agility}} == Intelligence == {{main|Intelligence}} == Constitution == {{main|Constitution}} [[Category:Attributes]] 9e68b22348fa67fdf1237f31b0043c8996b44821 Template:Fnum 10 713 1092 2025-08-22T00:44:05Z Sharparam 284703 Created page with "{{#invoke:Formatnum|main}}<noinclude> {{Documentation}} </noinclude>" wikitext text/x-wiki {{#invoke:Formatnum|main}}<noinclude> {{Documentation}} </noinclude> 610b9ebfdb987a06a7ffa7b6c9a99ace22ce370c Module:Formatnum 828 714 1093 2025-08-22T00:44:58Z Sharparam 284703 Created page with "local getArgs = require('Module:Arguments').getArgs local gaps = require('Module:Gapnum').gaps local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local number = args[1] or args.number or '' local prec = args.prec or nil return p.formatNum(number, prec) end function p.formatNum(number, prec) -- Do not alter the specified value when it is not a valid number, return it as is local value = to..." Scribunto text/plain local getArgs = require('Module:Arguments').getArgs local gaps = require('Module:Gapnum').gaps local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local number = args[1] or args.number or '' local prec = args.prec or nil return p.formatNum(number, prec) end function p.formatNum(number, prec) -- Do not alter the specified value when it is not a valid number, return it as is local value = tonumber(number) if value == nil then return number end return gaps(value, { prec = prec }) end return p e262e6249b47c2293a72504f7c619d5a2319f144 Module:Formatnum/doc 828 715 1094 2025-08-22T00:45:21Z Sharparam 284703 Created page with "== Examples == * <syntaxhighlight lang="wikitext" inline>{{fnum|999999}}</syntaxhighlight> &rarr; {{fnum|999999}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999|prec=2}}</syntaxhighlight> &rarr; {{fnum|999999|prec=2}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999.99|prec=2}}</syntaxhighlight> &rarr; {{fnum|999999.99|prec=2}}" wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{fnum|999999}}</syntaxhighlight> &rarr; {{fnum|999999}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999|prec=2}}</syntaxhighlight> &rarr; {{fnum|999999|prec=2}} * <syntaxhighlight lang="wikitext" inline>{{fnum|999999.99|prec=2}}</syntaxhighlight> &rarr; {{fnum|999999.99|prec=2}} 0052a8d10ce94177ba8324b60420d90b79b8059f Module:Gapnum 828 716 1095 2025-08-22T00:45:51Z Sharparam 284703 Created page with "local p = {} local getArgs function p.main(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end local args = getArgs(frame, {wrappers = 'Template:Gapnum'}) local n = args[1] if not n then error('Parameter 1 is required') elseif not tonumber(n) and not tonumber(n, 36) then -- Validates any number with base ≤ 36 error('Unable to convert "' .. args[1] .. '" to a number') end local gap = args.gap local precision = tonumber(args.p..." Scribunto text/plain local p = {} local getArgs function p.main(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end local args = getArgs(frame, {wrappers = 'Template:Gapnum'}) local n = args[1] if not n then error('Parameter 1 is required') elseif not tonumber(n) and not tonumber(n, 36) then -- Validates any number with base ≤ 36 error('Unable to convert "' .. args[1] .. '" to a number') end local gap = args.gap local precision = tonumber(args.prec) return p.gaps(n,{gap=gap,prec=precision}) end -- Not named p._main so that it has a better function name when required by Module:Val function p.gaps(n,tbl) local nstr = tostring(n) if not tbl then tbl = {} end local gap = tbl.gap or '.25em' local int_part, frac_part = p.groups(n,tbl.prec) local ret = mw.html.create('span') :css('white-space','nowrap') -- No gap necessary on first group :wikitext(table.remove(int_part,1)) -- Build int part for _, v in ipairs(int_part) do ret:tag('span') :css('margin-left',gap) :wikitext(v) end if frac_part then -- The first group after the decimal shouldn't have a gap ret:wikitext('.' .. table.remove(frac_part,1)) -- Build frac part for _, v in ipairs(frac_part) do ret:tag('span') :css('margin-left',gap) :wikitext(v) end end return ret end -- Creates tables where each element is a different group of the number function p.groups(num,precision) local nstr = tostring(num) if not precision then precision = -1 else precision = tonumber(precision) end local decimalloc = nstr:find('.', 1, true) local int_part, frac_part if decimalloc == nil then int_part = nstr if precision > 0 then frac_part = "0" end else int_part = nstr:sub(1, decimalloc-1) frac_part = nstr:sub(decimalloc + 1) end -- only define ret_i as an empty table, let ret_d stay nil local ret_i,ret_d = {} -- Loop to handle most of the groupings; from right to left, so that if a group has less than 3 members, it will be the first group while int_part:len() > 3 do -- Insert in first spot, since we're moving backwards table.insert(ret_i,1,int_part:sub(-3)) int_part = int_part:sub(1,-4) end -- handle any left over numbers if int_part:len() > 0 then table.insert(ret_i,1,int_part) end if precision ~= 0 and frac_part then ret_d = {} if precision == -1 then precision = frac_part:len() end -- Reduce the length of the string if required precision is less than actual precision -- OR -- Increase it (by adding 0s) if the required precision is more than actual local offset = precision - frac_part:len() if offset < 0 then frac_part = frac_part:sub(1,precision) elseif offset > 0 then frac_part = frac_part .. string.rep('0', offset) end -- Allow groups of 3 or 2 (3 first) for v in string.gmatch(frac_part,'%d%d%d?') do table.insert(ret_d,v) end -- Preference for groups of 4 instead of groups of 1 at the end if #frac_part % 3 == 1 then if frac_part:len() == 1 then ret_d = {frac_part} else local last_g = ret_d[#ret_d] or '' last_g = last_g..frac_part:sub(-1) ret_d[#ret_d] = last_g end end end return ret_i,ret_d end return p 6f8d2352b772fec644235b007ba3793006835986 Template:Val 10 717 1098 1097 2025-08-22T00:55:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki <includeonly>{{safesubst:<noinclude/>#invoke:val|main}}</includeonly><noinclude> {{documentation}} </noinclude> de315e9728588de49567fc363ccc28b987b6e298 Module:Val 828 718 1100 1099 2025-08-22T00:55:50Z Sharparam 284703 1 revision imported Scribunto text/plain -- For Template:Val, output a number and optional unit. -- Format options include scientific and uncertainty notations. local numdot = '.' -- decimal mark (use ',' for Italian) local numsep = ',' -- group separator (use ' ' for Italian) local mtext = { -- Message and other text that should be localized. ['mt-bad-exponent'] = 'exponent parameter (<b>e</b>)', ['mt-parameter'] = 'parameter ', ['mt-not-number'] = 'is not a valid number', ['mt-cannot-range'] = 'cannot use a range if the first parameter includes "e"', ['mt-need-range'] = 'needs a range in parameter 2', ['mt-should-range'] = 'should be a range', ['mt-cannot-with-e'] = 'cannot be used if the first parameter includes "e"', ['mt-not-range'] = 'does not accept a range', ['mt-cannot-e'] = 'cannot use e notation', ['mt-too-many-parameter'] = 'too many parameters', ['mt-need-number'] = 'need a number after the last parameter because it is a range.', ['mt-ignore-parameter4'] = 'Val parameter 4 ignored', ['mt-val-not-supported'] = 'Val parameter "%s=%s" is not supported', ['mt-invalid-scale'] = 'Unit "%s" has invalid scale "%s"', ['mt-both-u-ul'] = 'unit (<b>u</b>) and unit with link (<b>ul</b>) are both specified, only one is allowed.', ['mt-both-up-upl'] = 'unit per (<b>up</b>) and unit per with link (<b>upl</b>) are both specified, only one is allowed.', } local data_module = 'Module:Val/units' local convert_module = 'Module:Convert' local function valerror(msg, nocat, iswarning) -- Return formatted message text for an error or warning. -- Can append "#FormattingError" to URL of a page with a problem to find it. local anchor = '<span id="FormattingError"></span>' local body, category if nocat or mw.title.getCurrentTitle():inNamespaces(1, 2, 3, 5) then -- No category in Talk, User, User_talk, or Wikipedia_talk. category = '' else category = '[[Category:Pages with incorrect formatting templates use]]' end iswarning = false -- problems are infrequent so try showing large error so editor will notice if iswarning then body = '<sup class="noprint Inline-Template" style="white-space:nowrap;">' .. '[[Template:Val|<span title="' .. msg:gsub('"', '&quot;') .. '">warning</span>]]</sup>' else body = '<strong class="error">' .. 'Error in &#123;&#123;[[Template:val|val]]&#125;&#125;: ' .. msg .. '</strong>' end return anchor .. body .. category end local range_types = { -- No need for '&nbsp;' because nowrap applies to all output. [","] = ", ", ["by"] = " by ", ["-"] = "–", ["–"] = "–", ["and"] = " and ", ["or"] = " or " , ["to"] = " to " , ["x"] = " × ", ["×"] = " × ", ["/"] = "/", } local range_repeat_unit = { -- WP:UNIT wants unit repeated when a "multiply" range is used. ["x"] = true, ["×"] = true, } local function extract_item(index, numbers, arg) -- Extract an item from arg and store the result in numbers[index]. -- If no argument or if argument is valid, return nil (no error); -- otherwise, return an error message. -- The stored result is: -- * a table for a number (empty if there was no specified number); or -- * a string for range text -- Input like 1e3 is regarded as invalid for all except argument 1 -- which accepts e notation as an alternative to the 'e' argument. -- Input group separators are removed. local which = index local function fail(msg) local description if which == 'e' then description = mtext['mt-bad-exponent'] else description = mtext['mt-parameter'] .. which end return description .. ' ' .. (msg or mtext['mt-not-number']) .. '.' end local result = {} local range = range_types[arg] if range then if type(index) == 'number' and (index % 2 == 0) then if index == 2 then if numbers[1] and numbers[1].exp then return fail(mtext['mt-cannot-range']) end numbers.has_ranges = true else if not numbers.has_ranges then return fail(mtext['mt-need-range']) end end numbers[index] = range if range_repeat_unit[arg] then -- Any "repeat" range forces unit (if any) to be repeated for all items. numbers.isrepeat = true end return nil end return fail(mtext['mt-not-range']) end if numbers.has_ranges and type(index) == 'number' and (index % 2 == 0) then return fail(mtext['mt-should-range']) end if index == 'e' then local e = numbers[1] and numbers[1].exp if e then if arg then return fail(mtext['mt-cannot-with-e']) end arg = e which = 1 end end if arg and arg ~= '' then arg = arg:gsub(numsep, '') if numdot ~= '.' then arg = arg:gsub(numdot, '.') end if arg:sub(1, 1) == '(' and arg:sub(-1) == ')' then result.parens = true arg = arg:sub(2, -2) end local a, b = arg:match('^(.+)[Ee](.+)$') if a then if index == 1 then arg = a result.exp = b else return fail(mtext['mt-cannot-e']) end end local isnegative, propersign, prefix local minus = '−' prefix, arg = arg:match('^(.-)([%d.]+)$') local value = tonumber(arg) if not value then return fail() end if arg:sub(1, 1) == '.' then arg = '0' .. arg end if prefix == '' then -- Ignore. elseif prefix == '±' then -- Display for first number, ignore for others. if index == 1 then propersign = '±' end elseif prefix == '+' then propersign = '+' elseif prefix == '-' or prefix == minus then propersign = minus isnegative = true else return fail() end result.clean = arg result.sign = propersign or '' result.value = isnegative and -value or value end numbers[index] = result return nil -- no error end local function get_args(numbers, args) -- Extract arguments and store the results in numbers. -- Return nothing (no error) if ok; otherwise, return an error message. for index = 1, 99 do local which = index local arg = args[which] -- has been trimmed if not arg then which = 'e' arg = args[which] end local msg = extract_item(which, numbers, arg) if msg then return msg end if which == 'e' then break end if index > 19 then return mtext['mt-too-many-parameter'] end end if numbers.has_ranges and (#numbers % 2 == 0) then return mtext['mt-need-number'] end end local function get_scale(text, ucode) -- Return the value of text as a number, or throw an error. -- This supports extremely basic expressions of the form: -- a / b -- a ^ b -- where a and b are numbers or 'pi'. local n = tonumber(text) if n then return n end n = text:gsub('pi', math.pi) for _, op in ipairs({ '/', '^' }) do local a, b = n:match('^(.-)' .. op .. '(.*)$') if a then a = tonumber(a) b = tonumber(b) if a and b then if op == '/' then return a / b elseif op == '^' then return a ^ b end end break end end error(string.format(mtext['mt-invalid-scale'], ucode, text)) end local function get_builtin_unit(ucode, definitions) -- Return table of information for the specified built-in unit, or nil if not known. -- Each defined unit code must be followed by two spaces (not tab characters). local _, pos = definitions:find('\n' .. ucode .. ' ', 1, true) if pos then local endline = definitions:find('%s*\n', pos) if endline then local result = {} local n = 0 local text = definitions:sub(pos + 1, endline - 1):gsub('%s%s+', '\t') for item in (text .. '\t'):gmatch('(%S.-)\t') do if item == 'ALIAS' then result.alias = true elseif item == 'ANGLE' then result.isangle = true result.nospace = true elseif item == 'NOSPACE' then result.nospace = true elseif item == 'SI' then result.si = true else n = n + 1 if n == 1 then local link, symbol = item:match('^%[%[([^|]+)|(.+)%]%]$') if link then result.symbol = symbol result.link = link n = 2 else result.symbol = item end elseif n == 2 then result.link = item elseif n == 3 then result.scale_text = item result.scale = get_scale(item, ucode) else result.more_ignored = item break end end end if result.si then local s = result.symbol if ucode == 'mc' .. s or ucode == 'mu' .. s then result.ucode = 'µ' .. s -- unit code for convert should be this end end if n >= 2 or (n >= 1 and result.alias) then return result end -- Ignore invalid definition, treating it as a comment. end end end local function convert_lookup(ucode, value, scaled_top, want_link, si, options) local lookup = require(convert_module)._unit return lookup(ucode, { value = value, scaled_top = scaled_top, link = want_link, si = si, sort = options.sortable, }) end local function get_unit(ucode, value, scaled_top, options) local want_link = options.want_link if scaled_top then want_link = options.want_per_link end local data = mw.loadData(data_module) local result = options.want_longscale and get_builtin_unit(ucode, data.builtin_units_long_scale) or get_builtin_unit(ucode, data.builtin_units) local si, use_convert if result then if result.alias then ucode = result.symbol use_convert = true end if result.scale then -- Setting si means convert will use the unit as given, and the sort key -- will be calculated from the value without any extra scaling that may -- occur if convert found the unit code. For example, if val defines the -- unit 'year' with a scale and if si were not set, convert would also apply -- its own scale because convert knows that a year is 31,557,600 seconds. si = { result.symbol, result.link } value = value * result.scale end if result.si then ucode = result.ucode or ucode si = { result.symbol, result.link } use_convert = true end else result = {} use_convert = true end local convert_unit = convert_lookup(ucode, value, scaled_top, want_link, si, options) result.sortkey = convert_unit.sortspan if use_convert then result.text = convert_unit.text result.scaled_top = convert_unit.scaled_value else if want_link then result.text = '[[' .. result.link .. '|' .. result.symbol .. ']]' else result.text = result.symbol end result.scaled_top = value end return result end local function makeunit(value, options) -- Return table of information for the requested unit and options, or -- return nil if no unit. options = options or {} local unit local ucode = options.u local percode = options.per if ucode then unit = get_unit(ucode, value, nil, options) elseif percode then unit = { nospace = true, scaled_top = value } else return nil end local text = unit.text or '' local sortkey = unit.sortkey if percode then local function bracketed(code, text) return code:find('[*./]') and '(' .. text .. ')' or text end local perunit = get_unit(percode, 1, unit.scaled_top, options) text = (ucode and bracketed(ucode, text) or '') .. '/' .. bracketed(percode, perunit.text) sortkey = perunit.sortkey end if not (unit.nospace or options.nospace) then text = '&nbsp;' .. text end return { text = text, isangle = unit.isangle, sortkey = sortkey } end local function list_units(mode) -- Return wikitext to list the built-in units. -- A unit code should not contain wikimarkup so don't bother escaping. local data = mw.loadData(data_module) local definitions = data.builtin_units .. data.builtin_units_long_scale local last_was_blank = true local n = 0 local result = {} local function add(line) if line == '' then last_was_blank = true else if last_was_blank and n > 0 then n = n + 1 result[n] = '' end last_was_blank = false n = n + 1 result[n] = line end end local si_prefixes = { -- These are the prefixes recognized by convert; u is accepted for micro. y = 'y', z = 'z', a = 'a', f = 'f', p = 'p', n = 'n', u = 'µ', ['µ'] = 'µ', m = 'm', c = 'c', d = 'd', da = 'da', h = 'h', k = 'k', M = 'M', G = 'G', T = 'T', P = 'P', E = 'E', Z = 'Z', Y = 'Y', } local function is_valid(ucode, unit) if unit and not unit.more_ignored then assert(type(unit.symbol) == 'string' and unit.symbol ~= '') if unit.alias then if unit.link or unit.scale_text or unit.si then return false end end if unit.si then if unit.scale_text then return false end ucode = unit.ucode or ucode local base = unit.symbol if ucode == base then unit.display = base return true end local plen = #ucode - #base if plen > 0 then local prefix = si_prefixes[ucode:sub(1, plen)] if prefix and ucode:sub(plen + 1) == base then unit.display = prefix .. base return true end end else unit.display = unit.symbol return true end end return false end local lookup = require(convert_module)._unit local function show_convert(ucode, unit) -- If a built-in unit defines a scale or sets the SI flag, any unit defined in -- convert is not used (the scale or SI prefix's scale is used for a sort key). -- If there is no scale or SI flag, and the unit is not defined in convert, -- the sort key may not be correct; this allows such units to be identified. if not (unit.si or unit.scale_text) then if mode == 'convert' then unit.show = not lookup(unit.alias and unit.symbol or ucode).unknown unit.show_text = 'CONVERT' elseif mode == 'unknown' then unit.show = lookup(unit.alias and unit.symbol or ucode).unknown unit.show_text = 'UNKNOWN' elseif not unit.alias then -- Show convert's scale in square brackets ('[1]' for an unknown unit). -- Don't show scale for an alias because it's misleading for temperature -- and an alias is probably not useful for anything else. local scale = lookup(ucode, {value=1, sort='on'}).scaled_value if type(scale) == 'number' then scale = string.format('%.5g', scale):gsub('e%+?(%-?)0*(%d+)', 'e%1%2') else scale = '?' end unit.show = true unit.show_text = '[' .. scale .. ']' end end end for line in definitions:gmatch('([^\n]*)\n') do local pos, _ = line:find(' ', 1, true) if pos then local ucode = line:sub(1, pos - 1) local unit = get_builtin_unit(ucode, '\n' .. line .. '\n') if is_valid(ucode, unit) then show_convert(ucode, unit) local flags, text if unit.alias then text = unit.symbol else text = '[[' .. unit.link .. '|' .. unit.display .. ']]' end if unit.isangle then unit.nospace = nil -- don't show redundant flag end for _, f in ipairs({ { 'alias', 'ALIAS' }, { 'isangle', 'ANGLE' }, { 'nospace', 'NOSPACE' }, { 'si', 'SI' }, { 'scale_text', unit.scale_text }, { 'show', unit.show_text }, }) do if unit[f[1]] then local t = f[2] if t:match('^%u+$') then t = '<small>' .. t .. '</small>' end if flags then flags = flags .. ' ' .. t else flags = t end end end if flags then text = text .. ' • ' .. flags end add(ucode .. ' = ' .. text .. '<br />') else add(line .. ' ◆ <b>invalid definition</b><br />') end else add(line) end end return table.concat(result, '\n') end local delimit_groups = require('Module:Gapnum').groups local function delimit(sign, numstr, fmt) -- Return sign and numstr (unsigned digits or numdot only) after formatting. -- Four-digit integers are not formatted with gaps. fmt = (fmt or ''):lower() if fmt == 'none' or (fmt == '' and #numstr == 4 and numstr:match('^%d+$')) then return sign .. numstr end -- Group number by integer and decimal parts. -- If there is no decimal part, delimit_groups returns only one table. local ipart, dpart = delimit_groups(numstr) local result if fmt == 'commas' then result = sign .. table.concat(ipart, numsep) if dpart then result = result .. numdot .. table.concat(dpart) end else -- Delimit with a small gap by default. local groups = {} groups[1] = table.remove(ipart, 1) for _, v in ipairs(ipart) do table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>') end if dpart then table.insert(groups, numdot .. (table.remove(dpart, 1) or '')) for _, v in ipairs(dpart) do table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>') end end result = sign .. table.concat(groups) end return result end local function sup_sub(sup, sub, align) -- Return the same result as Module:Su except val defaults to align=right. if align == 'l' or align == 'left' then align = 'left' elseif align == 'c' or align == 'center' then align = 'center' else align = 'right' end return '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:' .. align .. ';">' .. sup .. '<br />' .. sub .. '</span>' end local function range_text(items, unit_table, options) local fmt = options.fmt local nend = items.nend or '' if items.isrepeat or unit_table.isangle then nend = nend .. unit_table.text end local text = '' for i = 1, #items do if i % 2 == 0 then text = text .. items[i] else text = text .. delimit(items[i].sign, items[i].clean, fmt) .. nend end end return text end local function uncertainty_text(uncertainty, unit_table, options) local angle, text, need_parens if unit_table.isangle then angle = unit_table.text end local upper = uncertainty.upper or {} local lower = uncertainty.lower or {} local uncU = upper.clean if uncU then local fmt = options.fmt local uncL = lower.clean if uncL then uncU = delimit('+', uncU, fmt) .. (upper.errend or '') uncL = delimit('−', uncL, fmt) .. (lower.errend or '') if angle then uncU = uncU .. angle uncL = uncL .. angle end text = (angle or '') .. '<span style="margin-left:0.3em;">' .. sup_sub(uncU, uncL, options.align) .. '</span>' else if upper.parens then text = '(' .. uncU .. ')' -- old template did not delimit else text = (angle or '') .. '<span style="margin-left:0.225em;margin-right:0.225em;">±</span>' .. delimit('', uncU, fmt) need_parens = true end if uncertainty.errend then text = text .. uncertainty.errend end if angle then text = text .. angle end end else if angle then text = angle end end return text, need_parens end local function _main(values, unit_spec, options) if options.sandbox then data_module = data_module .. '/sandbox' convert_module = convert_module .. '/sandbox' end local action = options.action if action then if action == 'list' then -- Kludge: am using the align parameter (a=xxx) for type of list. return list_units(options.align) end return valerror('invalid action "' .. action .. '".', options.nocat) end local number = values.number or (values.numbers and values.numbers[1]) or {} local e_10 = options.e or {} local novalue = (number.value == nil and e_10.clean == nil) local fmt = options.fmt local want_sort = true local sortable = options.sortable if sortable == 'off' or (sortable == nil and novalue) then want_sort = false elseif sortable == 'debug' then -- Same as sortable = 'on' but the sort key is displayed. else sortable = 'on' end local sort_value = 1 if want_sort then sort_value = number.value or 1 if e_10.value and sort_value ~= 0 then -- The 'if' avoids {{val|0|e=1234}} giving an invalid sort_value due to overflow. sort_value = sort_value * 10^e_10.value end end local unit_table = makeunit(sort_value, { u = unit_spec.u, want_link = unit_spec.want_link, per = unit_spec.per, want_per_link = unit_spec.want_per_link, nospace = novalue, want_longscale = unit_spec.want_longscale, sortable = sortable, }) local sortkey if unit_table then if want_sort then sortkey = unit_table.sortkey end else unit_table = { text = '' } if want_sort then sortkey = convert_lookup('dummy', sort_value, nil, nil, nil, { sortable = sortable }).sortspan end end local final_unit = unit_table.isangle and '' or unit_table.text local e_text, n_text, need_parens local uncertainty = values.uncertainty if uncertainty then if number.clean then n_text = delimit(number.sign, number.clean, fmt) .. (number.nend or '') local text text, need_parens = uncertainty_text(uncertainty, unit_table, options) if text then n_text = n_text .. text end else n_text = '' end else if values.numbers.isrepeat then final_unit = '' end n_text = range_text(values.numbers, unit_table, options) need_parens = true end if e_10.clean then if need_parens then n_text = '(' .. n_text .. ')' end e_text = '10<sup>' .. delimit(e_10.sign, e_10.clean, fmt) .. '</sup>' if number.clean then e_text = '<span style="margin-left:0.25em;margin-right:0.15em;">×</span>' .. e_text end else e_text = '' end local result = (sortkey or '') .. (options.prefix or '') .. n_text .. e_text .. final_unit .. (options.suffix or '') if result ~= '' then result = '<span class="nowrap">' .. result .. '</span>' end return result .. (options.warning or '') end local function check_parameters(args, has_ranges, nocat) -- Return warning text for the first problem parameter found, or nothing if ok. local whitelist = { a = true, action = true, debug = true, e = true, ['end'] = true, errend = true, ['+errend'] = true, ['-errend'] = true, fmt = true, ['long scale'] = true, long_scale = true, longscale = true, nocategory = true, p = true, s = true, sortable = true, u = true, ul = true, up = true, upl = true, } for k, v in pairs(args) do if type(k) == 'string' and not whitelist[k] then local warning = string.format(mtext['mt-val-not-supported'], k, v) return valerror(warning, nocat, true) end end if not has_ranges and args[4] then return valerror(mtext['mt-ignore-parameter4'], nocat, true) end end local function main(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame, {wrappers = { 'Template:Val' }}) local nocat = args.nocategory local numbers = {} -- table of number tables, perhaps with range text local msg = get_args(numbers, args) if msg then return valerror(msg, nocat) end if args.u and args.ul then return valerror(mtext['mt-both-u-ul'], nocat) end if args.up and args.upl then return valerror(mtext['mt-both-up-upl'], nocat) end local values if numbers.has_ranges then -- Multiple values with range separators but no uncertainty. numbers.nend = args['end'] values = { numbers = numbers, } else -- A single value with optional uncertainty. local function setfield(i, dst, src) local v = args[src] if v then if numbers[i] then numbers[i][dst] = v else numbers[i] = { [dst] = v } end end end setfield(1, 'nend', 'end') setfield(2, 'errend', '+errend') setfield(3, 'errend', '-errend') values = { number = numbers[1], uncertainty = { upper = numbers[2], lower = numbers[3], errend = args.errend, } } end local unit_spec = { u = args.ul or args.u, want_link = args.ul ~= nil, per = args.upl or args.up, want_per_link = args.upl ~= nil, want_longscale = (args.longscale or args.long_scale or args['long scale']) == 'on', } local options = { action = args.action, align = args.a, e = numbers.e, fmt = args.fmt, nocat = nocat, prefix = args.p, sandbox = string.find(frame:getTitle(), 'sandbox', 1, true) ~= nil, sortable = args.sortable or (args.debug == 'yes' and 'debug' or nil), suffix = args.s, warning = check_parameters(args, numbers.has_ranges, nocat), } return _main(values, unit_spec, options) end return { main = main, _main = _main } 6a50e544e78223a89c0b012cb5fc6de86419edf8 Module:Val/units 828 719 1102 1101 2025-08-22T00:55:50Z Sharparam 284703 1 revision imported Scribunto text/plain -- Definitions for units known to val -- File format is two strings and a return statement with them in it: -- string in quotes [=[ ... builtin_units ... ]=]. -- string in quotes [=[ ... builtin_units_long_scale ... ]=]. -- First string, builtin_units, is short-scale, second string is long scale. -- Entry format: -- One record per line, starting in first column, having 2-4 fields. -- Field separator: two or more spaces -- Between first and second fields: two or more spaces -- Between all other fields: two or more spaces, or one or more tabs -- Entries without two spaces in them are ignored. -- There must be a blank line before the first entry and after the last. -- I.e. the first two and last two characters of the string must be newlines. -- Format of entry. Two record types: -- -- One record type is a wikilink: -- Unit-code [[ pagename | Symbol-accepts-HTML-only ]] -- Text-field separator is still two spaces. Two spaces not allowed in wikilink. -- -- The other record type is all fields: -- Unit-code symbol-accepts-HTML-only pagename#section-OK -- -- Plus there is an optional field that goes at the end after two or more spaces. -- Whether it is a number or an equation or the letters SI, -- any of these three has the same function: a wikitable sorting "scale". -- It is for sorting, and it works for either record type. -- Difference is SI can't accept HTML. But SI correctly scales any SI prefix. -- (Optional fields ALIAS and NOSPACE and ANGLE are for advanced users.) -- "Invalid unit" error: -- Using SI requires that the symbol equal unit-code, so never allows HTML. -- Any difference between SI or symbol must be an SI prefix, such as k, M, or G. -- A space at the end of an entry is an error. No space at each EOL. local builtin_units = [=[ == Test == Foo [[Hz|<samp>Foo</samp>]] Baz [[Hertz|baz<sub>0</sub>]] Baz [[Kelvins|baz<sub>0</sub>]] Bar [[Foobar|bar<abbr title="super duper">0</abbr>]] quux [[Foobar|<span title="super duper 2">bar0</span>]] == Unsorted units == c0 [[Speed of light#Numerical value, notation, and units|''c''<sub>0</sub>]] lbf [[Pound (force)|<span title="pound-force">lb<sub>F</sub></span>]] N.s [[Newton-second|N&sdot;s]] J.K-1 [[Joule per kelvin|J&sdot;K<sup>−1</sup>]] C.mol-1 [[Faraday constant|C&sdot;mol<sup>−1</sup>]] C/mol [[Faraday constant|C/mol]] C.kg-1 [[Roentgen (unit)|C&sdot;kg<sup>−1</sup>]] C/kg [[Roentgen (unit)|C/kg]] F.m-1 [[vacuum permittivity|F&sdot;m<sup>−1</sup>]] F/m [[vacuum permittivity|F/m]] e [[Elementary charge|''e'']] kB [[Kilobyte|kB]] 8e3 KB [[Kilobyte|KB]] 8e3 MB [[Megabyte|MB]] 8e6 GB [[Gigabyte|GB]] 8e9 TB [[Terabyte|TB]] 8e12 lx [[Lux (unit)|lx]] nat [[nat (unit)|nat]] == Time and frequency == byte/s [[Data rate units|byte/s]] 8 kB/s [[Data rate units#Kilobyte per second|<span title="Kilobytes per second">kB/s</span>]] 8e3 MB/s [[Data rate units#Megabyte per second|<span title="Megabytes per second">MB/s</span>]] 8e6 GB/s [[Data rate units#Gigabyte per second|<span title="Gigabytes per second">GB/s</span>]] 8e9 TB/s [[Data rate units#Terabyte per second|<span title="Terabytes per second">TB/s</span>]] 8e12 bit/s [[Bit per second|bit/s]] 1 bps [[Bit per second|bit/s]] 1 kbit/s [[Kilobit per second|kbit/s]] 1e3 Mbit/s [[Megabit per second|Mbit/s]] 1e6 Gbit/s [[Gigabit per second|Gbit/s]] 1e9 Tbit/s [[Terabit per second|Tbit/s]] 1e12 kT/s [[Transfer (computing)|<span title="Kilotransfers per second">kT/s</span>]] 1e3 MT/s [[Transfer (computing)|<span title="Megatransfers per second">MT/s</span>]] 1e6 GT/s [[Transfer (computing)|<span title="Gigatransfers per second">GT/s</span>]] 1e9 year [[Year|year]] 31557600 years [[Year|years]] 31557600 yr [[Year#Symbols and abbreviations|yr]] 31557600 y [[Year|y]] 31557600 a [[Annum|a]] 31557600 Ga [[Gigaannum|Ga]] 31557600000000000 Ma [[Megaannum|Ma]] 31557600000000 ka [[Kiloannum|ka]] 31557600000 kyr [[kyr|kyr]] 31557600000 kya [[kyr|kya]] 31557600000 myr [[myr|myr]] 31557600000000 mya [[Mya (unit)|mya]] 31557600000000 byr [[Billion years|byr]] 31557600000000000 bya [[Billion years ago|bya]] 31557600000000000 Gyr [[billion years|Gyr]] 31557600000000000 BP [[Before present|BP]] uBP [[Radiocarbon dating#Calibration|<sup>14</sup>C yr BP]] BC [[Before Christ|BC]] -1 AD [[Anno Domini|AD]] 1 BCE [[Before the Common Era|BCE]] -1 CE [[Common Era|CE]] 1 JD [[Julian date|JD]] 1 MJD [[Modified Julian date|MJD]] 1 s-1 [[Second|s<sup>−1</sup>]] s-2 [[Second|s<sup>−2</sup>]] s2 [[Second|s<sup>2</sup>]] s [[Second|s]] SI as [[Attosecond|s]] SI cs [[Second|s]] SI das [[Second|s]] SI ds [[Second|s]] SI Es [[Second|s]] SI fs [[Femtosecond|s]] SI Gs [[Second|s]] SI hs [[Second|s]] SI ks [[Second|s]] SI ms [[Millisecond|s]] SI µs [[Microsecond|s]] SI us [[Microsecond|s]] SI Ms [[Second|s]] SI ns [[Nanosecond|s]] SI ps [[Picosecond|s]] SI Ps [[Second|s]] SI Ts [[Second|s]] SI Ys [[Second|s]] SI ys [[Yoctosecond|s]] SI Zs [[Second|s]] SI zs [[Zeptosecond|s]] SI Hz [[Hertz|Hz]] SI aHz [[Hertz|Hz]] SI cHz [[Hertz|Hz]] SI daHz [[Hertz|Hz]] SI dHz [[Hertz|Hz]] SI EHz [[Hertz|Hz]] SI fHz [[Hertz|Hz]] SI hHz [[Hertz|Hz]] SI GHz [[Gigahertz|Hz]] SI kHz [[Kilohertz|Hz]] SI MHz [[Megahertz|Hz]] SI mHz [[Hertz|Hz]] SI uHz [[Hertz|Hz]] SI µHz [[Hertz|Hz]] SI nHz [[Hertz|Hz]] SI pHz [[Hertz|Hz]] SI PHz [[Hertz|Hz]] SI THz [[Hertz|Hz]] SI yHz [[Hertz|Hz]] SI YHz [[Hertz|Hz]] SI zHz [[Hertz|Hz]] SI ZHz [[Hertz|Hz]] SI ips [[Inch per second|ips]] == Length, area, volume == Å3 [[Ångström|Å<sup>3</sup>]] fb-1 [[Barn (unit)#Inverse femtobarn|fb<sup>−1</sup>]] m-1 [[Metre|m<sup>−1</sup>]] m-2 [[Square metre|m<sup>−2</sup>]] m-3 [[Cubic metre|m<sup>−3</sup>]] km2 [[Square kilometre|km<sup>2</sup>]] km3 [[Cubic kilometre|km<sup>3</sup>]] µm2 [[Square metre|µm<sup>2</sup>]] um2 [[Square metre|µm<sup>2</sup>]] am2 [[Square metre|am<sup>2</sup>]] cm2 [[Square centimetre|cm<sup>2</sup>]] dam2 [[Square metre|dam<sup>2</sup>]] dm2 [[Square metre|dm<sup>2</sup>]] Em2 [[Square metre|Em<sup>2</sup>]] fm2 [[Square metre|fm<sup>2</sup>]] Gm2 [[Square metre|Gm<sup>2</sup>]] hm2 [[Square metre|hm<sup>2</sup>]] mm2 [[Square metre|mm<sup>2</sup>]] Mm2 [[Square metre|Mm<sup>2</sup>]] nm2 [[Square metre|nm<sup>2</sup>]] pm2 [[Square metre|pm<sup>2</sup>]] Pm2 [[Square metre|Pm<sup>2</sup>]] Tm2 [[Square metre|Tm<sup>2</sup>]] ym2 [[Square metre|ym<sup>2</sup>]] Ym2 [[Square metre|Ym<sup>2</sup>]] zm2 [[Square metre|zm<sup>2</sup>]] Zm2 [[Square metre|Zm<sup>2</sup>]] gal [[Gallon|gal]] Gal [[Gal (unit)|Gal]] uGal [[Gal (unit)|µGal]] µGal [[Gal (unit)|µGal]] mGal [[Gal (unit)|mGal]] b [[Barn (unit)|b]] SI ab [[Barn (unit)|b]] SI cb [[Barn (unit)|b]] SI dab [[Barn (unit)|b]] SI db [[Barn (unit)|b]] SI Eb [[Barn (unit)|b]] SI fb [[Barn (unit)|b]] SI Gb [[Barn (unit)|b]] SI hb [[Barn (unit)|b]] SI kb [[Barn (unit)|b]] SI mb [[Barn (unit)|b]] SI µb [[Barn (unit)|b]] SI ub [[Barn (unit)|b]] SI Mb [[Barn (unit)|b]] SI nb [[Barn (unit)|b]] SI pb [[Barn (unit)|b]] SI Pb [[Barn (unit)|b]] SI Tb [[Barn (unit)|b]] SI Yb [[Barn (unit)|b]] SI yb [[Barn (unit)|b]] SI Zb [[Barn (unit)|b]] SI zb [[Barn (unit)|b]] SI == Velocity and acceleration == m.s-2 [[Metre per second squared|m&sdot;s<sup>−2</sup>]] m/s2 [[Metre per second squared|m/s<sup>2</sup>]] m.s-1 [[Metre per second|m&sdot;s<sup>−1</sup>]] m/s [[Metre per second|m/s]] km.s-1 [[Metre per second|km&sdot;s<sup>−1</sup>]] km/s [[Metre per second|km/s]] == Mass and energy == lbm [[Pound (mass)|<span title="pound-mass">lb<sub>m</sub></span>]] uJ [[Joule|µJ]] J.s [[Joule-second|J&sdot;s]] kWh [[Kilowatt hour|kWh]] kW.h [[Kilowatt hour|kW&sdot;h]] J/C [[Volt|J/C]] J/kg [[Joule|J/kg]] Da [[Dalton (unit)|Da]] SI EDa [[Dalton (unit)|Da]] SI PDa [[Dalton (unit)|Da]] SI TDa [[Dalton (unit)|Da]] SI GDa [[Dalton (unit)|Da]] SI MDa [[Dalton (unit)|Da]] SI kDa [[Dalton (unit)|Da]] SI mDa [[Dalton (unit)|Da]] SI uDa [[Dalton (unit)|Da]] SI μDa [[Dalton (unit)|Da]] SI nDa [[Dalton (unit)|Da]] SI pDa [[Dalton (unit)|Da]] SI fDa [[Dalton (unit)|Da]] SI aDa [[Dalton (unit)|Da]] SI g [[Gram|g]] SI ag [[Attogram|g]] SI cg [[Centigram|g]] SI dag [[Gram|g]] SI dg [[Decigram|g]] SI Eg [[Exagram|g]] SI fg [[Femtogram|g]] SI Gg [[Gigagram|g]] SI hg [[Kilogram#SI multiples|g]] SI kg [[Kilogram|g]] SI mcg [[Microgram|g]] SI Mg [[Megagram|g]] SI mg [[Milligram|g]] SI ug [[Microgram|g]] SI µg [[Microgram|g]] SI ng [[Nanogram|g]] SI Pg [[Petagram|g]] SI pg [[Picogram|g]] SI Tg [[Tonne|g]] SI yg [[Yoctogram|g]] SI Yg [[Yottagram|g]] SI zg [[Zeptogram|g]] SI Zg [[Zettagram|g]] SI == Pressure and density == psi [[Pounds per square inch|psi]] g.cm-3 [[Gram per cubic centimetre|g&sdot;cm<sup>−3</sup>]] g/cm3 [[Gram per cubic centimetre|g/cm<sup>3</sup>]] kg.m-3 [[Kilogram per cubic metre|kg&sdot;m<sup>−3</sup>]] kg/m3 [[Kilogram per cubic metre|kg/m<sup>3</sup>]] kg/cm3 [[Density#Formula and common units|kg/cm<sup>3</sup>]] g/L [[Gram per litre|g/L]] g/l [[Gram per litre|g/l]] mcg/dL [[Gram per litre|µg/dL]] mcg/dl [[Gram per litre|µg/dl]] mg/mL [[Gram per litre|mg/mL]] mg/ml [[Gram per litre|mg/ml]] ug/dL [[Gram per litre|µg/dL]] ug/dl [[Gram per litre|µg/dl]] μg/dL [[Gram per litre|μg/dL]] μg/dl [[Gram per litre|μg/dl]] mg.L-1 [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]] mg/L [[Gram per litre|<abbr title="milligrams per liter">mg/L</abbr>]] mg.l-1 [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]] mg/l [[Gram per litre|<abbr title="milligrams per liter">mg/l</abbr>]] == Fracture toughness == MPa.m.5 [[Fracture toughness|MPa&sdot;m<sup>1/2</sup>]] kPa.m.5 [[Fracture toughness|kPa&sdot;m<sup>1/2</sup>]] Pa.m.5 [[Fracture toughness|Pa&sdot;m<sup>1/2</sup>]] == Temperature == degC °C ALIAS degF °F ALIAS degR °R ALIAS K [[Kelvin|K]] SI YK [[Yottakelvin|K]] SI ZK [[Zettakelvin|K]] SI EK [[Kelvin|K]] SI PK [[Petakelvin|K]] SI TK [[Terakelvin|K]] SI GK [[Gigakelvin|K]] SI MK [[Megakelvin|K]] SI kK [[Kilokelvin|K]] SI hK [[Hectokelvin|K]] SI daK [[Decakelvin|K]] SI dK [[Decikelvin|K]] SI cK [[Centikelvin|K]] SI mK [[Millikelvin|K]] SI µK [[Microkelvin|K]] SI uK [[Microkelvin|K]] SI nK [[Nanokelvin|K]] SI pK [[Picokelvin|K]] SI fK [[Femtokelvin|K]] SI aK [[Attokelvin|K]] SI zK [[Zeptokelvin|K]] SI yK [[Yoctokelvin|K]] SI == Electromagnetism == Wb [[Weber (unit)|Wb]] N.A-2 [[Permeability (electromagnetism)|N&sdot;A<sup>−2</sup>]] H.m-1 [[Permeability (electromagnetism)|H&sdot;m<sup>−1</sup>]] V.m-1 [[Electric field|V&sdot;m<sup>−1</sup>]] V/m [[Electric field|V/m]] C [[Coulomb|C]] SI YC [[Coulomb|C]] SI ZC [[Coulomb|C]] SI EC [[Coulomb|C]] SI PC [[Coulomb|C]] SI TC [[Coulomb|C]] SI GC [[Coulomb|C]] SI MC [[Coulomb|C]] SI kC [[Coulomb|C]] SI hC [[Coulomb|C]] SI daC [[Coulomb|C]] SI dC [[Coulomb|C]] SI cC [[Coulomb|C]] SI mC [[Coulomb|C]] SI µC [[Coulomb|C]] SI uC [[Coulomb|C]] SI nC [[Coulomb|C]] SI pC [[Coulomb|C]] SI fC [[Coulomb|C]] SI aC [[Coulomb|C]] SI zC [[Coulomb|C]] SI yC [[Coulomb|C]] SI F [[Farad|F]] SI YF [[Farad|F]] SI ZF [[Farad|F]] SI EF [[Farad|F]] SI PF [[Farad|F]] SI TF [[Farad|F]] SI GF [[Farad|F]] SI MF [[Farad|F]] SI kF [[Farad|F]] SI hF [[Farad|F]] SI daF [[Farad|F]] SI dF [[Farad|F]] SI cF [[Farad|F]] SI mF [[Farad|F]] SI µF [[Farad|F]] SI uF [[Farad|F]] SI nF [[Farad|F]] SI pF [[Farad|F]] SI fF [[Farad|F]] SI aF [[Farad|F]] SI zF [[Farad|F]] SI yF [[Farad|F]] SI H [[Henry (unit)|H]] SI YH [[Henry (unit)|H]] SI ZH [[Henry (unit)|H]] SI EH [[Henry (unit)|H]] SI PH [[Henry (unit)|H]] SI TH [[Henry (unit)|H]] SI GH [[Henry (unit)|H]] SI MH [[Henry (unit)|H]] SI kH [[Henry (unit)|H]] SI hH [[Henry (unit)|H]] SI daH [[Henry (unit)|H]] SI dH [[Henry (unit)|H]] SI cH [[Henry (unit)|H]] SI mH [[Henry (unit)|H]] SI µH [[Henry (unit)|H]] SI uH [[Henry (unit)|H]] SI nH [[Henry (unit)|H]] SI pH [[Henry (unit)|H]] SI fH [[Henry (unit)|H]] SI aH [[Henry (unit)|H]] SI zH [[Henry (unit)|H]] SI yH [[Henry (unit)|H]] SI A [[Ampere|A]] SI YA [[Ampere|A]] SI ZA [[Ampere|A]] SI EA [[Ampere|A]] SI PA [[Ampere|A]] SI TA [[Ampere|A]] SI GA [[Ampere|A]] SI MA [[Ampere|A]] SI kA [[Ampere|A]] SI hA [[Ampere|A]] SI daA [[Ampere|A]] SI dA [[Ampere|A]] SI cA [[Ampere|A]] SI mA [[Ampere|A]] SI µA [[Ampere|A]] SI uA [[Ampere|A]] SI nA [[Ampere|A]] SI pA [[Ampere|A]] SI fA [[Ampere|A]] SI aA [[Ampere|A]] SI zA [[Ampere|A]] SI yA [[Ampere|A]] SI V [[Volt|V]] SI YV [[Volt|V]] SI ZV [[Volt|V]] SI EV [[Volt|V]] SI PV [[Volt|V]] SI TV [[Volt|V]] SI GV [[Volt|V]] SI MV [[Volt|V]] SI kV [[Volt|V]] SI hV [[Volt|V]] SI daV [[Volt|V]] SI dV [[Volt|V]] SI cV [[Volt|V]] SI mV [[Volt|V]] SI µV [[Volt|V]] SI uV [[Volt|V]] SI nV [[Volt|V]] SI pV [[Volt|V]] SI fV [[Volt|V]] SI aV [[Volt|V]] SI zV [[Volt|V]] SI yV [[Volt|V]] SI VA [[Volt-ampere|VA]] SI YVA [[Volt-ampere|VA]] SI ZVA [[Volt-ampere|VA]] SI EVA [[Volt-ampere|VA]] SI PVA [[Volt-ampere|VA]] SI TVA [[Volt-ampere|VA]] SI GVA [[Volt-ampere|VA]] SI MVA [[Volt-ampere|VA]] SI kVA [[Volt-ampere|VA]] SI hVA [[Volt-ampere|VA]] SI daVA [[Volt-ampere|VA]] SI dVA [[Volt-ampere|VA]] SI cVA [[Volt-ampere|VA]] SI mVA [[Volt-ampere|VA]] SI µVA [[Volt-ampere|VA]] SI uVA [[Volt-ampere|VA]] SI nVA [[Volt-ampere|VA]] SI pVA [[Volt-ampere|VA]] SI fVA [[Volt-ampere|VA]] SI aVA [[Volt-ampere|VA]] SI zVA [[Volt-ampere|VA]] SI yVA [[Volt-ampere|VA]] SI Ω [[Ohm|Ω]] SI YΩ.m [[Electrical resistivity and conductivity#Definition|YΩ&sdot;m]] 1e24 ZΩ.m [[Electrical resistivity and conductivity#Definition|ZΩ&sdot;m]] 1e21 EΩ.m [[Electrical resistivity and conductivity#Definition|EΩ&sdot;m]] 1e18 PΩ.m [[Electrical resistivity and conductivity#Definition|PΩ&sdot;m]] 1e15 TΩ.m [[Electrical resistivity and conductivity#Definition|TΩ&sdot;m]] 1e12 GΩ.m [[Electrical resistivity and conductivity#Definition|GΩ&sdot;m]] 1e9 MΩ.m [[Electrical resistivity and conductivity#Definition|MΩ&sdot;m]] 1e6 kΩ.m [[Electrical resistivity and conductivity#Definition|kΩ&sdot;m]] 1e3 Ω.m [[Electrical resistivity and conductivity#Definition|Ω&sdot;m]] 1 mΩ.m [[Electrical resistivity and conductivity#Definition|mΩ&sdot;m]] 1e-3 µΩ.m [[Electrical resistivity and conductivity#Definition|µΩ&sdot;m]] 1e-6 uΩ.m [[Electrical resistivity and conductivity#Definition|µΩ&sdot;m]] 1e-6 nΩ.m [[Electrical resistivity and conductivity#Definition|nΩ&sdot;m]] 1e-9 pΩ.m [[Electrical resistivity and conductivity#Definition|pΩ&sdot;m]] 1e-12 fΩ.m [[Electrical resistivity and conductivity#Definition|fΩ&sdot;m]] 1e-15 aΩ.m [[Electrical resistivity and conductivity#Definition|aΩ&sdot;m]] 1e-18 zΩ.m [[Electrical resistivity and conductivity#Definition|zΩ&sdot;m]] 1e-21 yΩ.m [[Electrical resistivity and conductivity#Definition|yΩ&sdot;m]] 1e-24 R [[Rayleigh (unit)|R]] SI G [[Gauss (unit)|G]] SI aG [[Attogauss|G]] SI cG [[Centigauss|G]] SI daG [[Decagauss|G]] SI dG [[Decigauss|G]] SI EG [[Exagauss|G]] SI fG [[Femtogauss|G]] SI GG [[Gigagauss|G]] SI hG [[Hectogauss|G]] SI kG [[Kilogauss|G]] SI MG [[Megagauss|G]] SI mG [[Milligauss|G]] SI uG [[Microgauss|G]] SI µG [[Microgauss|G]] SI nG [[Nanogauss|G]] SI PG [[Petagauss|G]] SI pG [[Picogauss|G]] SI TG [[Teragauss|G]] SI yG [[Yoctogauss|G]] SI YG [[Yottagauss|G]] SI zG [[Zeptogauss|G]] SI ZG [[Zettagauss|G]] SI T [[Tesla (unit)|T]] SI aT [[Attotesla|T]] SI cT [[Centitesla|T]] SI daT [[Decatesla|T]] SI dT [[Decitesla|T]] SI ET [[Exatesla|T]] SI fT [[Femtotesla|T]] SI GT [[Gigatesla|T]] SI hT [[Hectotesla|T]] SI kT [[Kilotesla|T]] SI MT [[Megatesla|T]] SI mT [[Millitesla|T]] SI uT [[Microtesla|T]] SI µT [[Microtesla|T]] SI nT [[Nanotesla|T]] SI PT [[Petatesla|T]] SI pT [[Picotesla|T]] SI TT [[Teratesla|T]] SI yT [[Yoctotesla|T]] SI YT [[Yottatesla|T]] SI zT [[Zeptotesla|T]] SI ZT [[Zettatesla|T]] SI == Astrophysics == au [[Astronomical unit|au]] c [[Speed of light|''c'']] ly [[Light-year|ly]] Earth mass [[Earth mass|''M''<sub>🜨</sub>]] Earth radius [[Earth radius|''R''<sub>🜨</sub>]] M_Earth [[Earth mass|''M''<sub>🜨</sub>]] R_Earth [[Earth radius|''R''<sub>🜨</sub>]] M+ [[Earth mass|''M''<sub>🜨</sub>]] R+ [[Earth radius|''R''<sub>🜨</sub>]] Jupiter mass [[Jupiter mass|''M''<sub>J</sub>]] Jupiter radius [[Jupiter radius|''R''<sub>J</sub>]] Jy [[Jansky|Jy]] M_Jupiter [[Jupiter mass|''M''<sub>J</sub>]] R_Jupiter [[Jupiter radius|''R''<sub>J</sub>]] Solar mass [[Solar mass|''M''<sub>&#x2609;</sub>]] solar mass [[Solar mass|''M''<sub>&#x2609;</sub>]] M_Solar [[Solar mass|''M''<sub>&#x2609;</sub>]] M_solar [[Solar mass|''M''<sub>&#x2609;</sub>]] R_Solar [[Solar radius|''R''<sub>&#x2609;</sub>]] R_solar [[Solar radius|''R''<sub>&#x2609;</sub>]] Solar radius [[Solar radius|''R''<sub>&#x2609;</sub>]] solar radius [[Solar radius|''R''<sub>&#x2609;</sub>]] Solar luminosity [[Solar luminosity|''L''<sub>&#x2609;</sub>]] solar luminosity [[Solar luminosity|''L''<sub>&#x2609;</sub>]] L_solar [[Solar luminosity|''L''<sub>&#x2609;</sub>]] L_Solar [[Solar luminosity|''L''<sub>&#x2609;</sub>]] Lo [[Solar luminosity|''L''<sub>&#x2609;</sub>]] pc2 [[Parsec|pc<sup>2</sup>]] pc3 [[Parsec|pc<sup>3</sup>]] kpc2 [[Parsec#Parsecs and kiloparsecs|kpc<sup>2</sup>]] kpc3 [[Parsec#Parsecs and kiloparsecs|kpc<sup>3</sup>]] kpc [[Parsec#Parsecs and kiloparsecs|kpc]] Mpc2 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>2</sup>]] Mpc3 [[Parsec#Megaparsecs and gigaparsecs|Mpc<sup>3</sup>]] Mpc [[Parsec#Megaparsecs and gigaparsecs|Mpc]] Gpc2 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>2</sup>]] Gpc3 [[Parsec#Megaparsecs and gigaparsecs|Gpc<sup>3</sup>]] Gpc [[Parsec#Megaparsecs and gigaparsecs|Gpc]] == Nuclear physics and chemistry == cm-1 [[Wavenumber|cm<sup>−1</sup>]] u [[Unified atomic mass unit|u]] osmol [[Osmole (unit)|osmol]] Osm [[Osmole (unit)|Osm]] M [[Molarity|M]] TM [[Molarity|M]] SI GM [[Molarity|M]] SI MM [[Molarity|M]] SI kM [[Molarity|M]] SI hM [[Molarity|M]] SI daM [[Molarity|M]] SI dM [[Molarity|M]] SI cM [[Molarity|M]] SI mM [[Molarity|M]] SI uM [[Molarity|M]] 1e-6 nM [[Molarity|M]] SI pM [[Molarity|M]] SI kg.mol-1 [[Molar mass|kg&sdot;mol<sup>−1</sup>]] kg/mol [[Molar mass|kg/mol]] g.mol-1 [[Molar mass|g&sdot;mol<sup>−1</sup>]] g/mol [[Molar mass|g/mol]] eV/c2 [[Electronvolt#Mass|eV/''c''<sup>2</sup>]] keV/c2 [[Electronvolt#Mass|keV/''c''<sup>2</sup>]] MeV/c2 [[Electronvolt#Mass|MeV/''c''<sup>2</sup>]] GeV/c2 [[Electronvolt#Mass|GeV/''c''<sup>2</sup>]] TeV/c2 [[Electronvolt#Mass|TeV/''c''<sup>2</sup>]] eV [[Electronvolt|eV]] meV [[Electronvolt|meV]] keV [[Electronvolt|keV]] MeV [[Electronvolt|MeV]] GeV [[Electronvolt|GeV]] TeV [[Electronvolt|TeV]] mol-1 [[Avogadro constant|mol<sup>−1</sup>]] J.mol-1 [[Joule per mole|J&sdot;mol<sup>−1</sup>]] J/mol [[Joule per mole|J/mol]] kJ.mol-1 [[Joule per mole|kJ&sdot;mol<sup>−1</sup>]] kJ/mol [[Joule per mole|kJ/mol]] MJ.mol-1 [[Joule per mole|MJ&sdot;mol<sup>−1</sup>]] MJ/mol [[Joule per mole|MJ/mol]] GJ.mol-1 [[Joule per mole|GJ&sdot;mol<sup>−1</sup>]] GJ/mol [[Joule per mole|GJ/mol]] TJ.mol-1 [[Joule per mole|TJ&sdot;mol<sup>−1</sup>]] TJ/mol [[Joule per mole|TJ/mol]] μB [[Bohr magneton|''μ''<sub>B</sub>]] == Numbers and phrases == pp [[Page (paper)|pp]] ppb [[Parts per billion|ppb]] 1e-9 ppm [[Parts per million|ppm]] 1e-6 billiard [[Orders of magnitude (numbers)#1015|billiard]] 1e15 billion [[1,000,000,000|billion]] 1e9 billionth [[1,000,000,000|billionth]] 1e-9 billionths [[1,000,000,000|billionths]] 1e-9 decilliard [[Orders of magnitude (numbers)#1063|decilliard]] 1e63 decillion [[Orders of magnitude (numbers)#1033|decillion]] 1e33 decillionth [[Orders of magnitude (numbers)#1033|decillionth]] 1e-33 decillionths [[Orders of magnitude (numbers)#1033|decillionths]] 1e-33 milliard [[1,000,000,000|milliard]] 1e9 million [[Million|million]] 1e6 millionth [[Million|millionth]] 1e-6 millionths [[Million|millionths]] 1e-6 nonilliard [[Orders of magnitude (numbers)#1057|nonilliard]] 1e57 nonillion [[Orders of magnitude (numbers)#1030|nonillion]] 1e30 nonillionth [[Orders of magnitude (numbers)#1030|nonillionth]] 1e-30 nonillionths [[Orders of magnitude (numbers)#1030|nonillionths]] 1e-30 octilliard [[Orders of magnitude (numbers)#1051|octilliard]] 1e51 octillion [[Orders of magnitude (numbers)#1027|octillion]] 1e27 octillionth [[Orders of magnitude (numbers)#1027|octillionth]] 1e-27 octillionths [[Orders of magnitude (numbers)#1027|octillionths]] 1e-27 quadrilliard [[Orders of magnitude (numbers)#1027|quadrilliard]] 1e27 quadrillion [[Orders of magnitude (numbers)#1015|quadrillion]] 1e15 quadrillionth [[Orders of magnitude (numbers)#1015|quadrillionth]] 1e-15 quadrillionths [[Orders of magnitude (numbers)#1015|quadrillionths]] 1e-15 quintilliard [[Orders of magnitude (numbers)#1033|quintilliard]] 1e33 quintillion [[Orders of magnitude (numbers)#1018|quintillion]] 1e18 quintillionth [[Orders of magnitude (numbers)#1018|quintillionth]] 1e-18 quintillionths [[Orders of magnitude (numbers)#1018|quintillionths]] 1e-18 septilliard [[Orders of magnitude (numbers)#1045|septilliard]] 1e45 septillion [[Orders of magnitude (numbers)#1024|septillion]] 1e24 septillionth [[Orders of magnitude (numbers)#1024|septillionth]] 1e-24 septillionths [[Orders of magnitude (numbers)#1024|septillionths]] 1e-24 sextilliard [[Orders of magnitude (numbers)#1039|sextilliard]] 1e39 sextillion [[Orders of magnitude (numbers)#1021|sextillion]] 1e21 sextillionth [[Orders of magnitude (numbers)#1021|sextillionth]] 1e-21 sextillionths [[Orders of magnitude (numbers)#1021|sextillionths]] 1e-21 trilliard [[Orders of magnitude (numbers)#1021|trilliard]] 1e21 trillion [[Orders of magnitude (numbers)#1012|trillion]] 1e12 trillionth [[Orders of magnitude (numbers)#1012|trillionth]] 1e-12 trillionths [[Orders of magnitude (numbers)#1012|trillionths]] 1e-12 == Angles == % % Percent ANGLE 0.01 percent % Percent ANGLE 0.01 per cent % Percent ANGLE 0.01 ‰ ‰ Per mil ANGLE 1e-3 per mil ‰ Per mil ANGLE 1e-3 per mill ‰ Per mil ANGLE 1e-3 per mille ‰ Per mil ANGLE 1e-3 permil ‰ Per mil ANGLE 1e-3 permill ‰ Per mil ANGLE 1e-3 permille ‰ Per mil ANGLE 1e-3 ° ° Degree (angle) ANGLE pi/180 deg ° Degree (angle) ANGLE pi/180 degree ° Degree (angle) NOSPACE pi/180 -- for a degree symbol that does not repeat ' ′ Minute of arc ANGLE pi/10800 ′ ′ Minute of arc ANGLE pi/10800 arcmin ′ Minute of arc ANGLE pi/10800 arcminute ′ Minute of arc ANGLE pi/10800 " ″ Second of arc ANGLE pi/648000 ″ ″ Second of arc ANGLE pi/648000 arcsec ″ Second of arc ANGLE pi/648000 arcsecond ″ Second of arc ANGLE pi/648000 mas [[Milliarcsecond|mas]] pi/648000000 ]=] -- If val has "|long scale=on" the following definitions are used -- (then, if not found here, the normal definitions are used). -- Unit code [[Link|Symbol]] Flags/Scale local builtin_units_long_scale = [=[ == Long scale numbers and phrases == billion [[Orders of magnitude (numbers)#1012|billion]] 1e12 billionth [[Orders of magnitude (numbers)#1012|billionth]] 1e-12 billionths [[Orders of magnitude (numbers)#1012|billionths]] 1e-12 decillion [[Orders of magnitude (numbers)#1060|decillion]] 1e60 decillionth [[Orders of magnitude (numbers)#1060|decillionth]] 1e-60 decillionths [[Orders of magnitude (numbers)#1060|decillionths]] 1e-60 nonillion [[Orders of magnitude (numbers)#1054|nonillion]] 1e54 nonillionth [[Orders of magnitude (numbers)#1054|nonillionth]] 1e-54 nonillionths [[Orders of magnitude (numbers)#1054|nonillionths]] 1e-54 octillion [[Orders of magnitude (numbers)#1048|octillion]] 1e48 octillionth [[Orders of magnitude (numbers)#1048|octillionth]] 1e-48 octillionths [[Orders of magnitude (numbers)#1048|octillionths]] 1e-48 quadrillion [[Orders of magnitude (numbers)#1024|quadrillion]] 1e24 quadrillionth [[Orders of magnitude (numbers)#1024|quadrillionth]] 1e-24 quadrillionths [[Orders of magnitude (numbers)#1024|quadrillionths]] 1e-24 quintillion [[Orders of magnitude (numbers)#1030|quintillion]] 1e30 quintillionth [[Orders of magnitude (numbers)#1030|quintillionth]] 1e-30 quintillionths [[Orders of magnitude (numbers)#1030|quintillionths]] 1e-30 septillion [[Orders of magnitude (numbers)#1042|septillion]] 1e42 septillionth [[Orders of magnitude (numbers)#1042|septillionth]] 1e-42 septillionths [[Orders of magnitude (numbers)#1042|septillionths]] 1e-42 sextillion [[Orders of magnitude (numbers)#1036|sextillion]] 1e36 sextillionth [[Orders of magnitude (numbers)#1036|sextillionth]] 1e-36 sextillionths [[Orders of magnitude (numbers)#1036|sextillionths]] 1e-36 trillion [[Orders of magnitude (numbers)#1018|trillion]] 1e18 trillionth [[Orders of magnitude (numbers)#1018|trillionth]] 1e-18 trillionths [[Orders of magnitude (numbers)#1018|trillionths]] 1e-18 ]=] return { builtin_units = builtin_units, builtin_units_long_scale = builtin_units_long_scale } 2307ae0d1410328f2d5ace7ab494855c5cb9c9e9 Module:Convert 828 720 1104 1103 2025-08-22T00:55:50Z Sharparam 284703 1 revision imported Scribunto text/plain -- Convert a value from one unit of measurement to another. -- Example: {{convert|123|lb|kg}} --> 123 pounds (56 kg) -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. local MINUS = '−' -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92) local abs = math.abs local floor = math.floor local format = string.format local log10 = math.log10 local ustring = mw.ustring local ulen = ustring.len local usub = ustring.sub -- Configuration options to keep magic values in one location. -- Conversion data and message text are defined in separate modules. local config, maxsigfig local numdot -- must be '.' or ',' or a character which works in a regex local numsep, numsep_remove, numsep_remove2 local data_code, all_units local text_code local varname -- can be a code to use variable names that depend on value local from_en_table -- to translate an output string of en digits to local language local to_en_table -- to translate an input string of digits in local language to en -- Use translation_table in convert/text to change the following. local en_default -- true uses lang=en unless convert has lang=local or local digits local group_method = 3 -- code for how many digits are in a group local per_word = 'per' -- for units like "liters per kilometer" local plural_suffix = 's' -- only other useful value is probably '' to disable plural unit names local omitsep -- true to omit separator before local symbol/name -- All units should be defined in the data module. However, to cater for quick changes -- and experiments, any unknown unit is looked up in an extra data module, if it exists. -- That module would be transcluded in only a small number of pages, so there should be -- little server overhead from making changes, and changes should propagate quickly. local extra_module -- name of module with extra units local extra_units -- nil or table of extra units from extra_module -- Some options in the invoking template can set variables used later in the module. local currency_text -- for a user-defined currency symbol: {{convert|12|$/ha|$=€}} (euro replaces dollar) local function from_en(text) -- Input is a string representing a number in en digits with '.' decimal mark, -- without digit grouping (which is done just after calling this). -- Return the translation of the string with numdot and digits in local language. if numdot ~= '.' then text = text:gsub('%.', numdot) end if from_en_table then text = text:gsub('%d', from_en_table) end return text end local function to_en(text) -- Input is a string representing a number in the local language with -- an optional numdot decimal mark and numsep digit grouping. -- Return the translation of the string with '.' mark and en digits, -- and no separators (they have to be removed here to handle cases like -- numsep = '.' and numdot = ',' with input "1.234.567,8"). if to_en_table then text = ustring.gsub(text, '%d', to_en_table) end if numsep_remove then text = text:gsub(numsep_remove, '') end if numsep_remove2 then text = text:gsub(numsep_remove2, '') end if numdot ~= '.' then text = text:gsub(numdot, '.') end return text end local function decimal_mark(text) -- Return ',' if text probably is using comma for decimal mark, or has no decimal mark. -- Return '.' if text probably is using dot for decimal mark. -- Otherwise return nothing (decimal mark not known). if not text:find('[.,]') then return ',' end text = text:gsub('^%-', ''):gsub('%+%d+/%d+$', ''):gsub('[Ee]%-?%d+$', '') local decimal = text:match('^0?([.,])%d+$') or text:match('%d([.,])%d?%d?$') or text:match('%d([.,])%d%d%d%d+$') if decimal then return decimal end if text:match('%.%d+%.') then return ',' end if text:match('%,%d+,') then return '.' end end local add_warning, with_separator -- forward declarations local function to_en_with_check(text, parms) -- Version of to_en() for a wiki using numdot = ',' and numsep = '.' to check -- text (an input number as a string) which might have been copied from enwiki. -- For example, in '1.234' the '.' could be a decimal mark or a group separator. -- From viwiki. if to_en_table then text = ustring.gsub(text, '%d', to_en_table) end if decimal_mark(text) == '.' then local original = text text = text:gsub(',', '') -- for example, interpret "1,234.5" as an enwiki value if parms then add_warning(parms, 0, 'cvt_enwiki_num', original, with_separator({}, text)) end else if numsep_remove then text = text:gsub(numsep_remove, '') end if numsep_remove2 then text = text:gsub(numsep_remove2, '') end if numdot ~= '.' then text = text:gsub(numdot, '.') end end return text end local function omit_separator(id) -- Return true if there should be no separator before id (a unit symbol or name). -- For zhwiki, there should be no separator if id uses local characters. -- The following kludge should be a sufficient test. if omitsep then if id:sub(1, 2) == '-{' then -- for "-{...}-" content language variant return true end if id:byte() > 127 then local first = usub(id, 1, 1) if first ~= 'Å' and first ~= '°' and first ~= 'µ' then return true end end end return id:sub(1, 1) == '/' -- no separator before units like "/ha" end local spell_module -- name of module that can spell numbers local speller -- function from that module to handle spelling (set if needed) local wikidata_module, wikidata_data_module -- names of Wikidata modules local wikidata_code, wikidata_data -- exported tables from those modules (set if needed) local function set_config(args) -- Set configuration options from template #invoke or defaults. config = args maxsigfig = config.maxsigfig or 14 -- maximum number of significant figures local data_module, text_module local sandbox = config.sandbox and ('/' .. config.sandbox) or '' data_module = "Module:Convert/data" .. sandbox text_module = "Module:Convert/text" .. sandbox extra_module = "Module:Convert/extra" .. sandbox wikidata_module = "Module:Convert/wikidata" .. sandbox wikidata_data_module = "Module:Convert/wikidata/data" .. sandbox spell_module = "Module:ConvertNumeric" data_code = mw.loadData(data_module) text_code = mw.loadData(text_module) all_units = data_code.all_units local translation = text_code.translation_table if translation then numdot = translation.numdot numsep = translation.numsep if numdot == ',' and numsep == '.' then if text_code.all_messages.cvt_enwiki_num then to_en = to_en_with_check end end if translation.group then group_method = translation.group end if translation.per_word then per_word = translation.per_word end if translation.plural_suffix then plural_suffix = translation.plural_suffix end varname = translation.varname from_en_table = translation.from_en local use_workaround = true if use_workaround then -- 2013-07-05 workaround bug by making a copy of the required table. -- mw.ustring.gsub fails with a table (to_en_table) as the replacement, -- if the table is accessed via mw.loadData. local source = translation.to_en if source then to_en_table = {} for k, v in pairs(source) do to_en_table[k] = v end end else to_en_table = translation.to_en end if translation.lang == 'en default' then en_default = true -- for hiwiki end omitsep = translation.omitsep -- for zhwiki end numdot = config.numdot or numdot or '.' -- decimal mark before fractional digits numsep = config.numsep or numsep or ',' -- group separator for numbers -- numsep should be ',' or '.' or '' or '&nbsp;' or a Unicode character. -- numsep_remove must work in a regex to identify separators to be removed. if numsep ~= '' then numsep_remove = (numsep == '.') and '%.' or numsep end if numsep ~= ',' and numdot ~= ',' then numsep_remove2 = ',' -- so numbers copied from enwiki will work end end local function collection() -- Return a table to hold items. return { n = 0, add = function (self, item) self.n = self.n + 1 self[self.n] = item end, } end local function divide(numerator, denominator) -- Return integers quotient, remainder resulting from dividing the two -- given numbers, which should be unsigned integers. local quotient, remainder = floor(numerator / denominator), numerator % denominator if not (0 <= remainder and remainder < denominator) then -- Floating point limits may need this, as in {{convert|160.02|Ym|ydftin}}. remainder = 0 end return quotient, remainder end local function split(text, delimiter) -- Return a numbered table with fields from splitting text. -- The delimiter is used in a regex without escaping (for example, '.' would fail). -- Each field has any leading/trailing whitespace removed. local t = {} text = text .. delimiter -- to get last item for item in text:gmatch('%s*(.-)%s*' .. delimiter) do table.insert(t, item) end return t end local function strip(text) -- If text is a string, return its content with no leading/trailing -- whitespace. Otherwise return nil (a nil argument gives a nil result). if type(text) == 'string' then return text:match("^%s*(.-)%s*$") end end local function table_len(t) -- Return length (<100) of a numbered table to replace #t which is -- documented to not work if t is accessed via mw.loadData(). for i = 1, 100 do if t[i] == nil then return i - 1 end end end local function wanted_category(catkey, catsort, want_warning) -- Return message category if it is wanted in current namespace, -- otherwise return ''. local cat local title = mw.title.getCurrentTitle() if title then local nsdefault = '0' -- default namespace: '0' = article; '0,10' = article and template local namespace = title.namespace for _, v in ipairs(split(config.nscat or nsdefault, ',')) do if namespace == tonumber(v) then cat = text_code.all_categories[want_warning and 'warning' or catkey] if catsort and catsort ~= '' and cat:sub(-2) == ']]' then cat = cat:sub(1, -3) .. '|' .. mw.text.nowiki(usub(catsort, 1, 20)) .. ']]' end break end end end return cat or '' end local function message(parms, mcode, is_warning) -- Return wikitext for an error message, including category if specified -- for the message type. -- mcode = numbered table specifying the message: -- mcode[1] = 'cvt_xxx' (string used as a key to get message info) -- mcode[2] = 'parm1' (string to replace '$1' if any in message) -- mcode[3] = 'parm2' (string to replace '$2' if any in message) -- mcode[4] = 'parm3' (string to replace '$3' if any in message) local msg if type(mcode) == 'table' then if mcode[1] == 'cvt_no_output' then -- Some errors should cause convert to output an empty string, -- for example, for an optional field in an infobox. return '' end msg = text_code.all_messages[mcode[1]] end parms.have_problem = true local function subparm(fmt, ...) local rep = {} for i, v in ipairs({...}) do rep['$' .. i] = v end return (fmt:gsub('$%d+', rep)) end if msg then local parts = {} local regex, replace = msg.regex, msg.replace for i = 1, 3 do local limit = 40 local s = mcode[i + 1] if s then if regex and replace then s = s:gsub(regex, replace) limit = nil -- allow long "should be" messages end -- Escape user input so it does not break the message. -- To avoid tags (like {{convert|1<math>23</math>|m}}) breaking -- the mouseover title, any strip marker starting with char(127) is -- replaced with '...' (text not needing i18n). local append local pos = s:find(string.char(127), 1, true) if pos then append = '...' s = s:sub(1, pos - 1) end if limit and ulen(s) > limit then s = usub(s, 1, limit) append = '...' end s = mw.text.nowiki(s) .. (append or '') else s = '?' end parts['$' .. i] = s end local function ispreview() -- Return true if a prominent message should be shown. if parms.test == 'preview' or parms.test == 'nopreview' then -- For testing, can preview a real message or simulate a preview -- when running automated tests. return parms.test == 'preview' end local success, revid = pcall(function () return (parms.frame):preprocess('{{REVISIONID}}') end) return success and (revid == '') end local want_warning = is_warning and not config.warnings and -- show unobtrusive warnings if config.warnings not configured not msg.nowarn -- but use msg settings, not standard warning, if specified local title = string.gsub(msg[1] or 'Missing message', '$%d+', parts) local text = want_warning and '*' or msg[2] or 'Missing message' local cat = wanted_category(msg[3], mcode[2], want_warning) local anchor = msg[4] or '' local fmtkey = ispreview() and 'cvt_format_preview' or (want_warning and 'cvt_format2' or msg.format or 'cvt_format') local fmt = text_code.all_messages[fmtkey] or 'convert: bug' return subparm(fmt, title:gsub('"', '&quot;'), text, cat, anchor) end return 'Convert internal error: unknown message' end function add_warning(parms, level, key, text1, text2) -- for forward declaration above -- If enabled, add a warning that will be displayed after the convert result. -- A higher level is more verbose: more kinds of warnings are displayed. -- To reduce output noise, only the first warning is displayed. if level <= (tonumber(config.warnings) or 1) then if parms.warnings == nil then parms.warnings = message(parms, { key, text1, text2 }, true) end end end local function spell_number(parms, inout, number, numerator, denominator) -- Return result of spelling (number, numerator, denominator), or -- return nil if spelling is not available or not supported for given text. -- Examples (each value must be a string or nil): -- number numerator denominator output -- ------ --------- ----------- ------------------- -- "1.23" nil nil one point two three -- "1" "2" "3" one and two thirds -- nil "2" "3" two thirds if not speller then local function get_speller(module) return require(module).spell_number end local success success, speller = pcall(get_speller, spell_module) if not success or type(speller) ~= 'function' then add_warning(parms, 1, 'cvt_no_spell', 'spell') return nil end end local case if parms.spell_upper == inout then case = true parms.spell_upper = nil -- only uppercase first word in a multiple unit end local sp = not parms.opt_sp_us local adj = parms.opt_adjectival return speller(number, numerator, denominator, case, sp, adj) end ------------------------------------------------------------------------ -- BEGIN: Code required only for built-in units. -- LATER: If need much more code, move to another module to simplify this module. local function speed_of_sound(altitude) -- This is for the Mach built-in unit of speed. -- Return speed of sound in metres per second at given altitude in feet. -- If no altitude given, use default (zero altitude = sea level). -- Table gives speed of sound in miles per hour at various altitudes: -- altitude = -17,499 to 402,499 feet -- mach_table[a + 4] = s where -- a = (altitude / 5000) rounded to nearest integer (-3 to 80) -- s = speed of sound (mph) at that altitude -- LATER: Should calculate result from an interpolation between the next -- lower and higher altitudes in table, rather than rounding to nearest. -- From: http://www.aerospaceweb.org/question/atmosphere/q0112.shtml local mach_table = { -- a = 799.5, 787.0, 774.2, 761.207051, -- -3 to 0 748.0, 734.6, 721.0, 707.0, 692.8, 678.3, 663.5, 660.1, 660.1, 660.1, -- 1 to 10 660.1, 660.1, 660.1, 662.0, 664.3, 666.5, 668.9, 671.1, 673.4, 675.6, -- 11 to 20 677.9, 683.7, 689.9, 696.0, 702.1, 708.1, 714.0, 719.9, 725.8, 731.6, -- 21 to 30 737.3, 737.7, 737.7, 736.2, 730.5, 724.6, 718.8, 712.9, 707.0, 701.0, -- 31 to 40 695.0, 688.9, 682.8, 676.6, 670.4, 664.1, 657.8, 652.9, 648.3, 643.7, -- 41 to 50 639.1, 634.4, 629.6, 624.8, 620.0, 615.2, 613.2, 613.2, 613.2, 613.5, -- 51 to 60 614.4, 615.3, 616.7, 619.8, 623.4, 629.7, 635.0, 641.1, 650.6, 660.0, -- 61 to 70 672.5, 674.3, 676.1, 677.9, 679.7, 681.5, 683.3, 685.1, 686.8, 688.6, -- 71 to 80 } altitude = altitude or 0 local a = (altitude < 0) and -altitude or altitude a = floor(a / 5000 + 0.5) if altitude < 0 then a = -a end if a < -3 then a = -3 elseif a > 80 then a = 80 end return mach_table[a + 4] * 0.44704 -- mph converted to m/s end -- END: Code required only for built-in units. ------------------------------------------------------------------------ local function add_style(parms, class) -- Add selected template style to parms if not already present. parms.templatestyles = parms.templatestyles or {} if not parms.templatestyles[class] then parms.templatestyles[class] = parms.frame:extensionTag({ name = 'templatestyles', args = { src = text_code.titles[class] } }) end end local function get_styles(parms) -- Return string of required template styles, empty if none. if parms.templatestyles then local t = {} for _, v in pairs(parms.templatestyles) do table.insert(t, v) end return table.concat(t) end return '' end local function get_range(word) -- Return a range (string or table) corresponding to word (like "to"), -- or return nil if not a range word. local ranges = text_code.ranges return ranges.types[word] or ranges.types[ranges.aliases[word]] end local function check_mismatch(unit1, unit2) -- If unit1 cannot be converted to unit2, return an error message table. -- This allows conversion between units of the same type, and between -- Nm (normally torque) and ftlb (energy), as in gun-related articles. -- This works because Nm is the base unit (scale = 1) for both the -- primary type (torque), and the alternate type (energy, where Nm = J). -- A match occurs if the primary types are the same, or if unit1 matches -- the alternate type of unit2, and vice versa. That provides a whitelist -- of which conversions are permitted between normally incompatible types. if unit1.utype == unit2.utype or (unit1.utype == unit2.alttype and unit1.alttype == unit2.utype) then return nil end return { 'cvt_mismatch', unit1.utype, unit2.utype } end local function override_from(out_table, in_table, fields) -- Copy the specified fields from in_table to out_table, but do not -- copy nil fields (keep any corresponding field in out_table). for _, field in ipairs(fields) do if in_table[field] then out_table[field] = in_table[field] end end end local function shallow_copy(t) -- Return a shallow copy of table t. -- Do not need the features and overhead of the Scribunto mw.clone(). local result = {} for k, v in pairs(t) do result[k] = v end return result end local unit_mt = { -- Metatable to get missing values for a unit that does not accept SI prefixes. -- Warning: The boolean value 'false' is returned for any missing field -- so __index is not called twice for the same field in a given unit. __index = function (self, key) local value if key == 'name1' or key == 'sym_us' then value = self.symbol elseif key == 'name2' then value = self.name1 .. plural_suffix elseif key == 'name1_us' then value = self.name1 if not rawget(self, 'name2_us') then -- If name1_us is 'foot', do not make name2_us by appending plural_suffix. self.name2_us = self.name2 end elseif key == 'name2_us' then local raw1_us = rawget(self, 'name1_us') if raw1_us then value = raw1_us .. plural_suffix else value = self.name2 end elseif key == 'link' then value = self.name1 else value = false end rawset(self, key, value) return value end } local function prefixed_name(unit, name, index) -- Return unit name with SI prefix inserted at correct position. -- index = 1 (name1), 2 (name2), 3 (name1_us), 4 (name2_us). -- The position is a byte (not character) index, so use Lua's sub(). local pos = rawget(unit, 'prefix_position') if type(pos) == 'string' then pos = tonumber(split(pos, ',')[index]) end if pos then return name:sub(1, pos - 1) .. unit.si_name .. name:sub(pos) end return unit.si_name .. name end local unit_prefixed_mt = { -- Metatable to get missing values for a unit that accepts SI prefixes. -- Before use, fields si_name, si_prefix must be defined. -- The unit must define _symbol, _name1 and -- may define _sym_us, _name1_us, _name2_us -- (_sym_us, _name2_us may be defined for a language using sp=us -- to refer to a variant unrelated to U.S. units). __index = function (self, key) local value if key == 'symbol' then value = self.si_prefix .. self._symbol if value == 'l' then value = 'L' end elseif key == 'sym_us' then value = rawget(self, '_sym_us') if value then value = self.si_prefix .. value else value = self.symbol end elseif key == 'name1' then value = prefixed_name(self, self._name1, 1) elseif key == 'name2' then value = rawget(self, '_name2') if value then value = prefixed_name(self, value, 2) else value = self.name1 .. plural_suffix end elseif key == 'name1_us' then value = rawget(self, '_name1_us') if value then value = prefixed_name(self, value, 3) else value = self.name1 end elseif key == 'name2_us' then value = rawget(self, '_name2_us') if value then value = prefixed_name(self, value, 4) elseif rawget(self, '_name1_us') then value = self.name1_us .. plural_suffix else value = self.name2 end elseif key == 'link' then value = self.name1 else value = false end rawset(self, key, value) return value end } local unit_per_mt = { -- Metatable to get values for a per unit of form "x/y". -- This is never called to determine a unit name or link because per units -- are handled as a special case. -- Similarly, the default output is handled elsewhere, and for a symbol -- this is only called from get_default() for default_exceptions. __index = function (self, key) local value if key == 'symbol' then local per = self.per local unit1, unit2 = per[1], per[2] if unit1 then value = unit1[key] .. '/' .. unit2[key] else value = '/' .. unit2[key] end elseif key == 'sym_us' then value = self.symbol elseif key == 'scale' then local per = self.per local unit1, unit2 = per[1], per[2] value = (unit1 and unit1.scale or 1) * self.scalemultiplier / unit2.scale else value = false end rawset(self, key, value) return value end } local function make_per(unitcode, unit_table, ulookup) -- Return true, t where t is a per unit with unit codes expanded to unit tables, -- or return false, t where t is an error message table. local result = { unitcode = unitcode, utype = unit_table.utype, per = {} } override_from(result, unit_table, { 'invert', 'iscomplex', 'default', 'link', 'symbol', 'symlink' }) result.symbol_raw = (result.symbol or false) -- to distinguish between a defined exception and a metatable calculation local prefix for i, v in ipairs(unit_table.per) do if i == 1 and v == '' then -- First unit symbol can be empty; that gives a nil first unit table. elseif i == 1 and text_code.currency[v] then prefix = currency_text or v else local success, t = ulookup(v) if not success then return false, t end result.per[i] = t end end local multiplier = unit_table.multiplier if not result.utype then -- Creating an automatic per unit. local unit1 = result.per[1] local utype = (unit1 and unit1.utype or prefix or '') .. '/' .. result.per[2].utype local t = data_code.per_unit_fixups[utype] if t then if type(t) == 'table' then utype = t.utype or utype result.link = result.link or t.link multiplier = multiplier or t.multiplier else utype = t end end result.utype = utype end result.scalemultiplier = multiplier or 1 result.vprefix = prefix or false -- set to non-nil to avoid calling __index return true, setmetatable(result, unit_per_mt) end local function lookup(parms, unitcode, what, utable, fails, depth) -- Return true, t where t is a copy of the unit's converter table, -- or return false, t where t is an error message table. -- Parameter 'what' determines whether combination units are accepted: -- 'no_combination' : single unit only -- 'any_combination' : single unit or combination or output multiple -- 'only_multiple' : single unit or output multiple only -- Parameter unitcode is a symbol (like 'g'), with an optional SI prefix (like 'kg'). -- If, for example, 'kg' is in this table, that entry is used; -- otherwise the prefix ('k') is applied to the base unit ('g'). -- If unitcode is a known combination code (and if allowed by what), -- a table of output multiple unit tables is included in the result. -- For compatibility with the old template, an underscore in a unitcode is -- replaced with a space so usage like {{convert|350|board_feet}} works. -- Wikignomes may also put two spaces or "&nbsp;" in combinations, so -- replace underscore, "&nbsp;", and multiple spaces with a single space. utable = utable or parms.unittable or all_units fails = fails or {} depth = depth and depth + 1 or 1 if depth > 9 then -- There are ways to mistakenly define units which result in infinite -- recursion when lookup() is called. That gives a long delay and very -- confusing error messages, so the depth parameter is used as a guard. return false, { 'cvt_lookup', unitcode } end if unitcode == nil or unitcode == '' then return false, { 'cvt_no_unit' } end unitcode = unitcode:gsub('_', ' '):gsub('&nbsp;', ' '):gsub(' +', ' ') local function call_make_per(t) return make_per(unitcode, t, function (ucode) return lookup(parms, ucode, 'no_combination', utable, fails, depth) end ) end local t = utable[unitcode] if t then if t.shouldbe then return false, { 'cvt_should_be', t.shouldbe } end if t.sp_us then parms.opt_sp_us = true end local target = t.target -- nil, or unitcode is an alias for this target if target then local success, result = lookup(parms, target, what, utable, fails, depth) if not success then return false, result end override_from(result, t, { 'customary', 'default', 'link', 'symbol', 'symlink', 'usename' }) local multiplier = t.multiplier if multiplier then result.multiplier = tostring(multiplier) result.scale = result.scale * multiplier end return true, result end if t.per then return call_make_per(t) end local combo = t.combination -- nil or a table of unitcodes if combo then local multiple = t.multiple if what == 'no_combination' or (what == 'only_multiple' and not multiple) then return false, { 'cvt_bad_unit', unitcode } end -- Recursively create a combination table containing the -- converter table of each unitcode. local result = { utype = t.utype, multiple = multiple, combination = {} } local cvt = result.combination for i, v in ipairs(combo) do local success, t = lookup(parms, v, multiple and 'no_combination' or 'only_multiple', utable, fails, depth) if not success then return false, t end cvt[i] = t end return true, result end local result = shallow_copy(t) result.unitcode = unitcode if result.prefixes then result.si_name = '' result.si_prefix = '' return true, setmetatable(result, unit_prefixed_mt) end return true, setmetatable(result, unit_mt) end local SIprefixes = text_code.SIprefixes for plen = SIprefixes[1] or 2, 1, -1 do -- Look for an SI prefix; should never occur with an alias. -- Check for longer prefix first ('dam' is decametre). -- SIprefixes[1] = prefix maximum #characters (as seen by mw.ustring.sub). local prefix = usub(unitcode, 1, plen) local si = SIprefixes[prefix] if si then local t = utable[usub(unitcode, plen+1)] if t and t.prefixes then local result = shallow_copy(t) result.unitcode = unitcode result.si_name = parms.opt_sp_us and si.name_us or si.name result.si_prefix = si.prefix or prefix result.scale = t.scale * 10 ^ (si.exponent * t.prefixes) return true, setmetatable(result, unit_prefixed_mt) end end end -- Accept user-defined combinations like "acre+m2+ha" or "acre m2 ha" for output. -- If '+' is used, each unit code can include a space, and any error is fatal. -- If ' ' is used and if each space-separated word is a unit code, it is a combo, -- but errors are not fatal so the unit code can be looked up as an extra unit. local err_is_fatal local combo = collection() if unitcode:find('+', 1, true) then err_is_fatal = true for item in (unitcode .. '+'):gmatch('%s*(.-)%s*%+') do if item ~= '' then combo:add(item) end end elseif unitcode:find('%s') then for item in unitcode:gmatch('%S+') do combo:add(item) end end if combo.n > 1 then local function lookup_combo() if what == 'no_combination' or what == 'only_multiple' then return false, { 'cvt_bad_unit', unitcode } end local result = { combination = {} } local cvt = result.combination for i, v in ipairs(combo) do local success, t = lookup(parms, v, 'only_multiple', utable, fails, depth) if not success then return false, t end if i == 1 then result.utype = t.utype else local mismatch = check_mismatch(result, t) if mismatch then return false, mismatch end end cvt[i] = t end return true, result end local success, result = lookup_combo() if success or err_is_fatal then return success, result end end -- Accept any unit with an engineering notation prefix like "e6cuft" -- (million cubic feet), but not chained prefixes like "e3e6cuft", -- and not if the unit is a combination or multiple, -- and not if the unit has an offset or is a built-in. -- Only en digits are accepted. local e, exponent, baseunit = unitcode:match('^([Ee])(%d+)(.*)') if exponent then local engscale = text_code.eng_scales[exponent] if engscale then local success, result = lookup(parms, baseunit, 'no_combination', utable, fails, depth) if success and not (result.offset or result.builtin or result.engscale) then if e == 'E' then result.this_number_word = true unitcode = 'e' .. unitcode:sub(2) end result.unitcode = unitcode -- 'e6cuft' not 'cuft' result.defkey = unitcode -- key to lookup default exception result.engscale = engscale result.scale = result.scale * 10 ^ tonumber(exponent) return true, result end end end -- Look for x/y; split on right-most slash to get scale correct (x/y/z is x/y per z). local top, bottom = unitcode:match('^(.-)/([^/]+)$') if top and not unitcode:find('e%d') then -- If valid, create an automatic per unit for an "x/y" unit code. -- The unitcode must not include extraneous spaces. -- Engineering notation (apart from at start and which has been stripped before here), -- is not supported so do not make a per unit if find text like 'e3' in unitcode. local success, result = call_make_per({ per = {top, bottom} }) if success then return true, result end end if not parms.opt_ignore_error and not get_range(unitcode) then -- Want the "what links here" list for the extra_module to show only cases -- where an extra unit is used, so do not require it if invoked from {{val}} -- or if looking up a range word which cannot be a unit. if not extra_units then local success, extra = pcall(function () return require(extra_module).extra_units end) if success and type(extra) == 'table' then extra_units = extra end end if extra_units then -- A unit in one data table might refer to a unit in the other table, so -- switch between them, relying on fails or depth to terminate loops. if not fails[unitcode] then fails[unitcode] = true local other = (utable == all_units) and extra_units or all_units local success, result = lookup(parms, unitcode, what, other, fails, depth) if success then return true, result end end end end if to_en_table then -- At fawiki it is common to translate all digits so a unit like "km2" becomes "km۲". local en_code = ustring.gsub(unitcode, '%d', to_en_table) if en_code ~= unitcode then return lookup(parms, en_code, what, utable, fails, depth) end end return false, { 'cvt_unknown', unitcode } end local function valid_number(num) -- Return true if num is a valid number. -- In Scribunto (different from some standard Lua), when expressed as a string, -- overflow or other problems are indicated with text like "inf" or "nan" -- which are regarded as invalid here (each contains "n"). if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then return true end end local function hyphenated(name, parts) -- Return a hyphenated form of given name (for adjectival usage). -- The name may be linked and the target of the link must not be changed. -- Hypothetical examples: -- [[long ton|ton]] → [[long ton|ton]] (no change) -- [[tonne|long ton]] → [[tonne|long-ton]] -- [[metric ton|long ton]] → [[metric ton|long-ton]] -- [[long ton]] → [[long ton|long-ton]] -- Input can also have multiple links in a single name like: -- [[United States customary units|U.S.]] [[US gallon|gallon]] -- [[mile]]s per [[United States customary units|U.S.]] [[quart]] -- [[long ton]]s per [[short ton]] -- Assume that links cannot be nested (never like "[[abc[[def]]ghi]]"). -- This uses a simple and efficient procedure that works for most cases. -- Some units (if used) would require more, and can later think about -- adding a method to handle exceptions. -- The procedure is to replace each space with a hyphen, but -- not a space after ')' [for "(pre-1954&nbsp;US) nautical mile"], and -- not spaces immediately before '(' or in '(...)' [for cases like -- "British thermal unit (ISO)" and "Calorie (International Steam Table)"]. if name:find(' ', 1, true) then if parts then local pos if name:sub(1, 1) == '(' then pos = name:find(')', 1, true) if pos then return name:sub(1, pos+1) .. name:sub(pos+2):gsub(' ', '-') end elseif name:sub(-1) == ')' then pos = name:find('(', 1, true) if pos then return name:sub(1, pos-2):gsub(' ', '-') .. name:sub(pos-1) end end return name:gsub(' ', '-') end parts = collection() for before, item, after in name:gmatch('([^[]*)(%[%[[^[]*%]%])([^[]*)') do if item:find(' ', 1, true) then local prefix local plen = item:find('|', 1, true) if plen then prefix = item:sub(1, plen) item = item:sub(plen + 1, -3) else prefix = item:sub(1, -3) .. '|' item = item:sub(3, -3) end item = prefix .. hyphenated(item, parts) .. ']]' end parts:add(before:gsub(' ', '-') .. item .. after:gsub(' ', '-')) end if parts.n == 0 then -- No link like "[[...]]" was found in the original name. parts:add(hyphenated(name, parts)) end return table.concat(parts) end return name end local function hyphenated_maybe(parms, want_name, sep, id, inout) -- Return s, f where -- s = id, possibly modified -- f = true if hyphenated -- Possible modifications: hyphenate; prepend '-'; append mid text. if id == nil or id == '' then return '' end local mid = (inout == (parms.opt_flip and 'out' or 'in')) and parms.mid or '' if want_name then if parms.opt_adjectival then return '-' .. hyphenated(id) .. mid, true end if parms.opt_add_s and id:sub(-1) ~= 's' then id = id .. 's' -- for nowiki end end return sep .. id .. mid end local function use_minus(text) -- Return text with Unicode minus instead of '-', if present. if text:sub(1, 1) == '-' then return MINUS .. text:sub(2) end return text end local function digit_groups(parms, text, method) -- Return a numbered table of groups of digits (left-to-right, in local language). -- Parameter method is a number or nil: -- 3 for 3-digit grouping (default), or -- 2 for 3-then-2 grouping (only for digits before decimal mark). local len_right local len_left = text:find('.', 1, true) if len_left then len_right = #text - len_left len_left = len_left - 1 else len_left = #text end local twos = method == 2 and len_left > 5 local groups = collection() local run = len_left local n if run < 4 or (run == 4 and parms.opt_comma5) then if parms.opt_gaps then n = run else n = #text end elseif twos then n = run % 2 == 0 and 1 or 2 else n = run % 3 == 0 and 3 or run % 3 end while run > 0 do groups:add(n) run = run - n n = (twos and run > 3) and 2 or 3 end if len_right then if groups.n == 0 then groups:add(0) end if parms.opt_gaps and len_right > 3 then local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit local isfirst = true run = len_right while run > 0 do n = (want4 and run == 4) and 4 or (run > 3 and 3 or run) if isfirst then isfirst = false groups[groups.n] = groups[groups.n] + 1 + n else groups:add(n) end run = run - n end else groups[groups.n] = groups[groups.n] + 1 + len_right end end local pos = 1 for i, length in ipairs(groups) do groups[i] = from_en(text:sub(pos, pos + length - 1)) pos = pos + length end return groups end function with_separator(parms, text) -- for forward declaration above -- Input text is a number in en digits with optional '.' decimal mark. -- Return an equivalent, formatted for display: -- with a custom decimal mark instead of '.', if wanted -- with thousand separators inserted, if wanted -- digits in local language -- The given text is like '123' or '123.' or '12345.6789'. -- The text has no sign (caller inserts that later, if necessary). -- When using gaps, they are inserted before and after the decimal mark. -- Separators are inserted only before the decimal mark. -- A trailing dot (as in '123.') is removed because their use appears to -- be accidental, and such a number should be shown as '123' or '123.0'. -- It is useful for convert to suppress the dot so, for example, '4000.' -- is a simple way of indicating that all the digits are significant. if text:sub(-1) == '.' then text = text:sub(1, -2) end if #text < 4 or parms.opt_nocomma or numsep == '' then return from_en(text) end local groups = digit_groups(parms, text, group_method) if parms.opt_gaps then if groups.n <= 1 then return groups[1] or '' end local nowrap = '<span style="white-space: nowrap">' local gap = '<span style="margin-left: 0.25em">' local close = '</span>' return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close end return table.concat(groups, numsep) end -- An input value like 1.23e12 is displayed using scientific notation (1.23×10¹²). -- That also makes the output use scientific notation, except for small values. -- In addition, very small or very large output values use scientific notation. -- Use format(fmtpower, significand, '10', exponent) where each argument is a string. local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>' local function with_exponent(parms, show, exponent) -- Return wikitext to display the implied value in scientific notation. -- Input uses en digits; output uses digits in local language. return format(fmtpower, with_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent)))) end local function make_sigfig(value, sigfig) -- Return show, exponent that are equivalent to the result of -- converting the number 'value' (where value >= 0) to a string, -- rounded to 'sigfig' significant figures. -- The returned items are: -- show: a string of digits; no sign and no dot; -- there is an implied dot before show. -- exponent: a number (an integer) to shift the implied dot. -- Resulting value = tonumber('.' .. show) * 10^exponent. -- Examples: -- make_sigfig(23.456, 3) returns '235', 2 (.235 * 10^2). -- make_sigfig(0.0023456, 3) returns '235', -2 (.235 * 10^-2). -- make_sigfig(0, 3) returns '000', 1 (.000 * 10^1). if sigfig <= 0 then sigfig = 1 elseif sigfig > maxsigfig then sigfig = maxsigfig end if value == 0 then return string.rep('0', sigfig), 1 end local exp, fracpart = math.modf(log10(value)) if fracpart >= 0 then fracpart = fracpart - 1 exp = exp + 1 end local digits = format('%.0f', 10^(fracpart + sigfig)) if #digits > sigfig then -- Overflow (for sigfig=3: like 0.9999 rounding to "1000"; need "100"). digits = digits:sub(1, sigfig) exp = exp + 1 end assert(#digits == sigfig, 'Bug: rounded number has wrong length') return digits, exp end -- Fraction output format. local fracfmt = { { -- Like {{frac}} (fraction slash). '<span class="frac">{SIGN}<span class="num">{NUM}</span>&frasl;<span class="den">{DEN}</span></span>', -- 1/2 '<span class="frac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="num">{NUM}</span>&frasl;<span class="den">{DEN}</span></span>', -- 1+2/3 style = 'frac', }, { -- Like {{sfrac}} (stacked fraction, that is, horizontal bar). '<span class="sfrac tion">{SIGN}<span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span>', -- 1//2 '<span class="sfrac">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="tion"><span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span></span>', -- 1+2//3 style = 'sfrac', }, } local function format_fraction(parms, inout, negative, wholestr, numstr, denstr, do_spell, style) -- Return wikitext for a fraction, possibly spelled. -- Inputs use en digits and have no sign; output uses digits in local language. local wikitext if not style then style = parms.opt_fraction_horizontal and 2 or 1 end if wholestr == '' then wholestr = nil end local substitute = { SIGN = negative and MINUS or '', WHOLE = wholestr and with_separator(parms, wholestr), NUM = from_en(numstr), DEN = from_en(denstr), } wikitext = fracfmt[style][wholestr and 2 or 1]:gsub('{(%u+)}', substitute) if do_spell then if negative then if wholestr then wholestr = '-' .. wholestr else numstr = '-' .. numstr end end local s = spell_number(parms, inout, wholestr, numstr, denstr) if s then return s end end add_style(parms, fracfmt[style].style) return wikitext end local function format_number(parms, show, exponent, isnegative) -- Parameter show is a string or a table containing strings. -- Each string is a formatted number in en digits and optional '.' decimal mark. -- A table represents a fraction: integer, numerator, denominator; -- if a table is given, exponent must be nil. -- Return t where t is a table with fields: -- show = wikitext formatted to display implied value -- (digits in local language) -- is_scientific = true if show uses scientific notation -- clean = unformatted show (possibly adjusted and with inserted '.') -- (en digits) -- sign = '' or MINUS -- exponent = exponent (possibly adjusted) -- The clean and exponent fields can be used to calculate the -- rounded absolute value, if needed. -- -- The value implied by the arguments is found from: -- exponent is nil; and -- show is a string of digits (no sign), with an optional dot; -- show = '123.4' is value 123.4, '1234' is value 1234.0; -- or: -- exponent is an integer indicating where dot should be; -- show is a string of digits (no sign and no dot); -- there is an implied dot before show; -- show does not start with '0'; -- show = '1234', exponent = 3 is value 0.1234*10^3 = 123.4. -- -- The formatted result: -- * Is for an output value and is spelled if wanted and possible. -- * Includes a Unicode minus if isnegative and not spelled. -- * Uses a custom decimal mark, if wanted. -- * Has digits grouped where necessary, if wanted. -- * Uses scientific notation if requested, or for very small or large values -- (which forces result to not be spelled). -- * Has no more than maxsigfig significant digits -- (same as old template and {{#expr}}). local xhi, xlo -- these control when scientific notation (exponent) is used if parms.opt_scientific then xhi, xlo = 4, 2 -- default for output if input uses e-notation elseif parms.opt_scientific_always then xhi, xlo = 0, 0 -- always use scientific notation (experimental) else xhi, xlo = 10, 4 -- default end local sign = isnegative and MINUS or '' local maxlen = maxsigfig local tfrac if type(show) == 'table' then tfrac = show show = tfrac.wholestr assert(exponent == nil, 'Bug: exponent given with fraction') end if not tfrac and not exponent then local integer, dot, decimals = show:match('^(%d*)(%.?)(.*)') if integer == '0' or integer == '' then local zeros, figs = decimals:match('^(0*)([^0]?.*)') if #figs == 0 then if #zeros > maxlen then show = '0.' .. zeros:sub(1, maxlen) end elseif #zeros >= xlo then show = figs exponent = -#zeros elseif #figs > maxlen then show = '0.' .. zeros .. figs:sub(1, maxlen) end elseif #integer >= xhi then show = integer .. decimals exponent = #integer else maxlen = maxlen + #dot if #show > maxlen then show = show:sub(1, maxlen) end end end if exponent then local function zeros(n) return string.rep('0', n) end if #show > maxlen then show = show:sub(1, maxlen) end if exponent > xhi or exponent <= -xlo or (exponent == xhi and show ~= '1' .. zeros(xhi - 1)) then -- When xhi, xlo = 10, 4 (the default), scientific notation is used if the -- rounded value satisfies: value >= 1e9 or value < 1e-4 (1e9 = 0.1e10), -- except if show is '1000000000' (1e9), for example: -- {{convert|1000000000|m|m|sigfig=10}} → 1,000,000,000 metres (1,000,000,000 m) local significand if #show > 1 then significand = show:sub(1, 1) .. '.' .. show:sub(2) else significand = show end return { clean = '.' .. show, exponent = exponent, sign = sign, show = sign .. with_exponent(parms, significand, exponent-1), is_scientific = true, } end if exponent >= #show then show = show .. zeros(exponent - #show) -- result has no dot elseif exponent <= 0 then show = '0.' .. zeros(-exponent) .. show else show = show:sub(1, exponent) .. '.' .. show:sub(exponent+1) end end local formatted_show if tfrac then show = tostring(tfrac.value) -- to set clean in returned table formatted_show = format_fraction(parms, 'out', isnegative, tfrac.wholestr, tfrac.numstr, tfrac.denstr, parms.opt_spell_out) else if isnegative and show:match('^0.?0*$') then sign = '' -- don't show minus if result is negative but rounds to zero end formatted_show = sign .. with_separator(parms, show) if parms.opt_spell_out then formatted_show = spell_number(parms, 'out', sign .. show) or formatted_show end end return { clean = show, sign = sign, show = formatted_show, is_scientific = false, -- to avoid calling __index } end local function extract_fraction(parms, text, negative) -- If text represents a fraction, return -- value, altvalue, show, denominator -- where -- value is a number (value of the fraction in argument text) -- altvalue is an alternate interpretation of any fraction for the hands -- unit where "12.1+3/4" means 12 hands 1.75 inches -- show is a string (formatted text for display of an input value, -- and is spelled if wanted and possible) -- denominator is value of the denominator in the fraction -- Otherwise, return nil. -- Input uses en digits and '.' decimal mark (input has been translated). -- Output uses digits in local language and local decimal mark, if any. ------------------------------------------------------------------------ -- Originally this function accepted x+y/z where x, y, z were any valid -- numbers, possibly with a sign. For example '1.23e+2+1.2/2.4' = 123.5, -- and '2-3/8' = 1.625. However, such usages were found to be errors or -- misunderstandings, so since August 2014 the following restrictions apply: -- x (if present) is an integer or has a single digit after decimal mark -- y and z are unsigned integers -- e-notation is not accepted -- The overall number can start with '+' or '-' (so '12+3/4' and '+12+3/4' -- and '-12-3/4' are valid). -- Any leading negative sign is removed by the caller, so only inputs -- like the following are accepted here (may have whitespace): -- negative = false false true (there was a leading '-') -- text = '2/3' '+2/3' '2/3' -- text = '1+2/3' '+1+2/3' '1-2/3' -- text = '12.3+1/2' '+12.3+1/2' '12.3-1/2' -- Values like '12.3+1/2' are accepted, but are intended only for use -- with the hands unit (not worth adding code to enforce that). ------------------------------------------------------------------------ local leading_plus, prefix, numstr, slashes, denstr = text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*(/+)%s*(%d+)%s*$') if not leading_plus then -- Accept a single U+2044 fraction slash because that may be pasted. leading_plus, prefix, numstr, denstr = text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*⁄%s*(%d+)%s*$') slashes = '/' end local numerator = tonumber(numstr) local denominator = tonumber(denstr) if numerator == nil or denominator == nil or (negative and leading_plus ~= '') then return nil end local whole, wholestr if prefix == '' then wholestr = '' whole = 0 else -- Any prefix must be like '12+' or '12-' (whole number and fraction sign); -- '12.3+' and '12.3-' are also accepted (single digit after decimal point) -- because '12.3+1/2 hands' is valid (12 hands 3½ inches). local num1, num2, frac_sign = prefix:match('^(%d+)(%.?%d?)%s*([+%-])$') if num1 == nil then return nil end if num2 == '' then -- num2 must be '' or like '.1' but not '.' or '.12' wholestr = num1 else if #num2 ~= 2 then return nil end wholestr = num1 .. num2 end if frac_sign ~= (negative and '-' or '+') then return nil end whole = tonumber(wholestr) if whole == nil then return nil end end local value = whole + numerator / denominator if not valid_number(value) then return nil end local altvalue = whole + numerator / (denominator * 10) local style = #slashes -- kludge: 1 or 2 slashes can be used to select style if style > 2 then style = 2 end local wikitext = format_fraction(parms, 'in', negative, leading_plus .. wholestr, numstr, denstr, parms.opt_spell_in, style) return value, altvalue, wikitext, denominator end local function extract_number(parms, text, another, no_fraction) -- Return true, info if can extract a number from text, -- where info is a table with the result, -- or return false, t where t is an error message table. -- Input can use en digits or digits in local language and can -- have references at the end. Accepting references is intended -- for use in infoboxes with a field for a value passed to convert. -- Parameter another = true if the expected value is not the first. -- Before processing, the input text is cleaned: -- * Any thousand separators (valid or not) are removed. -- * Any sign is replaced with '-' (if negative) or '' (otherwise). -- That replaces Unicode minus with '-'. -- If successful, the returned info table contains named fields: -- value = a valid number -- altvalue = a valid number, usually same as value but different -- if fraction used (for hands unit) -- singular = true if value is 1 or -1 (to use singular form of units) -- clean = cleaned text with any separators and sign removed -- (en digits and '.' decimal mark) -- show = text formatted for output, possibly with ref strip markers -- (digits in local language and custom decimal mark) -- The resulting show: -- * Is for an input value and is spelled if wanted and possible. -- * Has a rounded value, if wanted. -- * Has digits grouped where necessary, if wanted. -- * If negative, a Unicode minus is used; otherwise the sign is -- '+' (if the input text used '+'), or is '' (if no sign in input). text = strip(text or '') local reference local pos = text:find('\127', 1, true) if pos then local before = text:sub(1, pos - 1) local remainder = text:sub(pos) local refs = {} while #remainder > 0 do local ref, spaces ref, spaces, remainder = remainder:match('^(\127[^\127]*UNIQ[^\127]*%-ref[^\127]*\127)(%s*)(.*)') if ref then table.insert(refs, ref) else refs = {} break end end if #refs > 0 then text = strip(before) reference = table.concat(refs) end end local clean = to_en(text, parms) if clean == '' then return false, { another and 'cvt_no_num2' or 'cvt_no_num' } end local isnegative, propersign = false, '' -- most common case local singular, show, denominator local value = tonumber(clean) local altvalue if value then local sign = clean:sub(1, 1) if sign == '+' or sign == '-' then propersign = (sign == '+') and '+' or MINUS clean = clean:sub(2) end if value < 0 then isnegative = true value = -value end else local valstr for _, prefix in ipairs({ '-', MINUS, '&minus;' }) do -- Including '-' sets isnegative in case input is a fraction like '-2-3/4'. local plen = #prefix if clean:sub(1, plen) == prefix then valstr = clean:sub(plen + 1) if valstr:match('^%s') then -- "- 1" is invalid but "-1 - 1/2" is ok return false, { 'cvt_bad_num', text } end break end end if valstr then isnegative = true propersign = MINUS clean = valstr value = tonumber(clean) end if value == nil then if not no_fraction then value, altvalue, show, denominator = extract_fraction(parms, clean, isnegative) end if value == nil then return false, { 'cvt_bad_num', text } end if value <= 1 then singular = true -- for example, "½ mile" or "one half mile" (singular unit) end end end if not valid_number(value) then -- for example, "1e310" may overflow return false, { 'cvt_invalid_num' } end if show == nil then -- clean is a non-empty string with no spaces, and does not represent a fraction, -- and value = tonumber(clean) is a number >= 0. -- If the input uses e-notation, show will be displayed using a power of ten, but -- we use the number as given so it might not be normalized scientific notation. -- The input value is spelled if specified so any e-notation is ignored; -- that allows input like 2e6 to be spelled as "two million" which works -- because the spell module converts '2e6' to '2000000' before spelling. local function rounded(value, default, exponent) local precision = parms.opt_ri if precision then local fmt = '%.' .. format('%d', precision) .. 'f' local result = fmt:format(tonumber(value) + 2e-14) -- fudge for some common cases of bad rounding if not exponent then singular = (tonumber(result) == 1) end return result end return default end singular = (value == 1) local scientific local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)') if significand then show = with_exponent(parms, rounded(significand, significand, exponent), exponent) scientific = true else show = with_separator(parms, rounded(value, clean)) end show = propersign .. show if parms.opt_spell_in then show = spell_number(parms, 'in', propersign .. rounded(value, clean)) or show scientific = false end if scientific then parms.opt_scientific = true end end if isnegative and (value ~= 0) then value = -value altvalue = -(altvalue or value) end return true, { value = value, altvalue = altvalue or value, singular = singular, clean = clean, show = show .. (reference or ''), denominator = denominator, } end local function get_number(text) -- Return v, f where: -- v = nil (text is not a number) -- or -- v = value of text (text is a number) -- f = true if value is an integer -- Input can use en digits or digits in local language or separators, -- but no Unicode minus, and no fraction. if text then local number = tonumber(to_en(text)) if number then local _, fracpart = math.modf(number) return number, (fracpart == 0) end end end local function gcd(a, b) -- Return the greatest common denominator for the given values, -- which are known to be positive integers. if a > b then a, b = b, a end if a <= 0 then return b end local r = b % a if r <= 0 then return a end if r == 1 then return 1 end return gcd(r, a) end local function fraction_table(value, denominator) -- Return value as a string or a table: -- * If result is a string, there is no fraction, and the result -- is value formatted as a string of en digits. -- * If result is a table, it represents a fraction with named fields: -- wholestr, numstr, denstr (strings of en digits for integer, numerator, denominator). -- The result is rounded to the nearest multiple of (1/denominator). -- If the multiple is zero, no fraction is included. -- No fraction is included if value is very large as the fraction would -- be unhelpful, particularly if scientific notation is required. -- Input value is a non-negative number. -- Input denominator is a positive integer for the desired fraction. if value <= 0 then return '0' end if denominator <= 0 or value > 1e8 then return format('%.2f', value) end local integer, decimals = math.modf(value) local numerator = floor((decimals * denominator) + 0.5 + 2e-14) -- add fudge for some common cases of bad rounding if numerator >= denominator then integer = integer + 1 numerator = 0 end local wholestr = tostring(integer) if numerator > 0 then local div = gcd(numerator, denominator) if div > 1 then numerator = numerator / div denominator = denominator / div end return { wholestr = (integer > 0) and wholestr or '', numstr = tostring(numerator), denstr = tostring(denominator), value = value, } end return wholestr end local function preunits(count, preunit1, preunit2) -- If count is 1: -- ignore preunit2 -- return p1 -- else: -- preunit1 is used for preunit2 if the latter is empty -- return p1, p2 -- where: -- p1 is text to insert before the input unit -- p2 is text to insert before the output unit -- p1 or p2 may be nil to mean "no preunit" -- Using '+' gives output like "5+ feet" (no space before, but space after). local function withspace(text, wantboth) -- Return text with space before and, if wantboth, after. -- However, no space is added if there is a space or '&nbsp;' or '-' -- at that position ('-' is for adjectival text). -- There is also no space if text starts with '&' -- (e.g. '&deg;' would display a degree symbol with no preceding space). local char = text:sub(1, 1) if char == '&' then return text -- an html entity can be used to specify the exact display end if not (char == ' ' or char == '-' or char == '+') then text = ' ' .. text end if wantboth then char = text:sub(-1, -1) if not (char == ' ' or char == '-' or text:sub(-6, -1) == '&nbsp;') then text = text .. ' ' end end return text end local PLUS = '+ ' preunit1 = preunit1 or '' local trim1 = strip(preunit1) if count == 1 then if trim1 == '' then return nil end if trim1 == '+' then return PLUS end return withspace(preunit1, true) end preunit1 = withspace(preunit1) preunit2 = preunit2 or '' local trim2 = strip(preunit2) if trim1 == '+' then if trim2 == '' or trim2 == '+' then return PLUS, PLUS end preunit1 = PLUS end if trim2 == '' then if trim1 == '' then return nil, nil end preunit2 = preunit1 elseif trim2 == '+' then preunit2 = PLUS elseif trim2 == '&#32;' then -- trick to make preunit2 empty preunit2 = nil else preunit2 = withspace(preunit2) end return preunit1, preunit2 end local function range_text(range, want_name, parms, before, after, inout, options) -- Return before .. rtext .. after -- where rtext is the text that separates two values in a range. local rtext, adj_text, exception options = options or {} if type(range) == 'table' then -- Table must specify range text for ('off' and 'on') or ('input' and 'output'), -- and may specify range text for 'adj=on', -- and may specify exception = true. rtext = range[want_name and 'off' or 'on'] or range[((inout == 'in') == (parms.opt_flip == true)) and 'output' or 'input'] adj_text = range['adj'] exception = range['exception'] else rtext = range end if parms.opt_adjectival then if want_name or (exception and parms.abbr_org == 'on') then rtext = adj_text or rtext:gsub(' ', '-'):gsub('&nbsp;', '-') end end if rtext == '–' and (options.spaced or after:sub(1, #MINUS) == MINUS) then rtext = '&nbsp;– ' end return before .. rtext .. after end local function get_composite(parms, iparm, in_unit_table) -- Look for a composite input unit. For example, {{convert|1|yd|2|ft|3|in}} -- would result in a call to this function with -- iparm = 3 (parms[iparm] = "2", just after the first unit) -- in_unit_table = (unit table for "yd"; contains value 1 for number of yards) -- Return true, iparm, unit where -- iparm = index just after the composite units (7 in above example) -- unit = composite unit table holding all input units, -- or return true if no composite unit is present in parms, -- or return false, t where t is an error message table. local default, subinfo local composite_units, count = { in_unit_table }, 1 local fixups = {} local total = in_unit_table.valinfo[1].value local subunit = in_unit_table while subunit.subdivs do -- subdivs is nil or a table of allowed subdivisions local subcode = strip(parms[iparm+1]) local subdiv = subunit.subdivs[subcode] or subunit.subdivs[(all_units[subcode] or {}).target] if not subdiv then break end local success success, subunit = lookup(parms, subcode, 'no_combination') if not success then return false, subunit end -- should never occur success, subinfo = extract_number(parms, parms[iparm]) if not success then return false, subinfo end iparm = iparm + 2 subunit.inout = 'in' subunit.valinfo = { subinfo } -- Recalculate total as a number of subdivisions. -- subdiv[1] = number of subdivisions per previous unit (integer > 1). total = total * subdiv[1] + subinfo.value if not default then -- set by the first subdiv with a default defined default = subdiv.default end count = count + 1 composite_units[count] = subunit if subdiv.unit or subdiv.name then fixups[count] = { unit = subdiv.unit, name = subdiv.name, valinfo = subunit.valinfo } end end if count == 1 then return true -- no error and no composite unit end for i, fixup in pairs(fixups) do local unit = fixup.unit local name = fixup.name if not unit or (count > 2 and name) then composite_units[i].fixed_name = name else local success, alternate = lookup(parms, unit, 'no_combination') if not success then return false, alternate end -- should never occur alternate.inout = 'in' alternate.valinfo = fixup.valinfo composite_units[i] = alternate end end return true, iparm, { utype = in_unit_table.utype, scale = subunit.scale, -- scale of last (least significant) unit valinfo = { { value = total, clean = subinfo.clean, denominator = subinfo.denominator } }, composite = composite_units, default = default or in_unit_table.default } end local function translate_parms(parms, kv_pairs) -- Update fields in parms by translating each key:value in kv_pairs to terms -- used by this module (may involve translating from local language to English). -- Also, checks are performed which may display warnings, if enabled. -- Return true if successful or return false, t where t is an error message table. currency_text = nil -- local testing can hold module in memory; must clear globals if kv_pairs.adj and kv_pairs.sing then -- For enwiki (before translation), warn if attempt to use adj and sing -- as the latter is a deprecated alias for the former. if kv_pairs.adj ~= kv_pairs.sing and kv_pairs.sing ~= '' then add_warning(parms, 1, 'cvt_unknown_option', 'sing=' .. kv_pairs.sing) end kv_pairs.sing = nil end kv_pairs.comma = kv_pairs.comma or config.comma -- for plwiki who want default comma=5 for loc_name, loc_value in pairs(kv_pairs) do local en_name = text_code.en_option_name[loc_name] if en_name then local en_value = text_code.en_option_value[en_name] if en_value == 'INTEGER' then -- altitude_ft, altitude_m, frac, sigfig en_value = nil if loc_value == '' then add_warning(parms, 2, 'cvt_empty_option', loc_name) else local minimum local number, is_integer = get_number(loc_value) if en_name == 'sigfig' then minimum = 1 elseif en_name == 'frac' then minimum = 2 if number and number < 0 then parms.opt_fraction_horizontal = true number = -number end else minimum = -1e6 end if number and is_integer and number >= minimum then en_value = number else local m if en_name == 'frac' then m = 'cvt_bad_frac' elseif en_name == 'sigfig' then m = 'cvt_bad_sigfig' else m = 'cvt_bad_altitude' end add_warning(parms, 1, m, loc_name .. '=' .. loc_value) end end elseif en_value == 'TEXT' then -- $, input, qid, qual, stylein, styleout, tracking en_value = loc_value ~= '' and loc_value or nil -- accept non-empty user text with no validation if not en_value and (en_name == '$' or en_name == 'qid' or en_name == 'qual') then add_warning(parms, 2, 'cvt_empty_option', loc_name) elseif en_name == '$' then -- Value should be a single character like "€" for the euro currency symbol, but anything is accepted. currency_text = (loc_value == 'euro') and '€' or loc_value elseif en_name == 'input' then -- May have something like {{convert|input=}} (empty input) if source is an infobox -- with optional fields. In that case, want to output nothing rather than an error. parms.input_text = loc_value -- keep input because parms.input is nil if loc_value == '' end else en_value = en_value[loc_value] if en_value and en_value:sub(-1) == '?' then en_value = en_value:sub(1, -2) add_warning(parms, -1, 'cvt_deprecated', loc_name .. '=' .. loc_value) end if en_value == nil then if loc_value == '' then add_warning(parms, 2, 'cvt_empty_option', loc_name) else add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value) end elseif en_value == '' then en_value = nil -- an ignored option like adj=off elseif type(en_value) == 'string' and en_value:sub(1, 4) == 'opt_' then for _, v in ipairs(split(en_value, ',')) do local lhs, rhs = v:match('^(.-)=(.+)$') if rhs then parms[lhs] = tonumber(rhs) or rhs else parms[v] = true end end en_value = nil end end parms[en_name] = en_value else add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value) end end local abbr_entered = parms.abbr local cfg_abbr = config.abbr if cfg_abbr then -- Don't warn if invalid because every convert would show that warning. if cfg_abbr == 'on always' then parms.abbr = 'on' elseif cfg_abbr == 'off always' then parms.abbr = 'off' elseif parms.abbr == nil then if cfg_abbr == 'on default' then parms.abbr = 'on' elseif cfg_abbr == 'off default' then parms.abbr = 'off' end end end if parms.abbr then if parms.abbr == 'unit' then parms.abbr = 'on' parms.number_word = true end parms.abbr_org = parms.abbr -- original abbr, before any flip elseif parms.opt_hand_hh then parms.abbr_org = 'on' parms.abbr = 'on' else parms.abbr = 'out' -- default is to abbreviate output only (use symbol, not name) end if parms.opt_order_out then -- Disable options that do not work in a useful way with order=out. parms.opt_flip = nil -- override adj=flip parms.opt_spell_in = nil parms.opt_spell_out = nil parms.opt_spell_upper = nil end if parms.opt_spell_out and not abbr_entered then parms.abbr = 'off' -- should show unit name when spelling the output value end if parms.opt_flip then local function swap_in_out(option) local value = parms[option] if value == 'in' then parms[option] = 'out' elseif value == 'out' then parms[option] = 'in' end end swap_in_out('abbr') swap_in_out('lk') if parms.opt_spell_in and not parms.opt_spell_out then -- For simplicity, and because it does not appear to be needed, -- user cannot set an option to spell the output only. parms.opt_spell_in = nil parms.opt_spell_out = true end end if parms.opt_spell_upper then parms.spell_upper = parms.opt_flip and 'out' or 'in' end if parms.opt_table or parms.opt_tablecen then if abbr_entered == nil and parms.lk == nil then parms.opt_values = true end parms.table_align = parms.opt_table and 'right' or 'center' end if parms.table_align or parms.opt_sortable_on then parms.need_table_or_sort = true end local disp_joins = text_code.disp_joins local default_joins = disp_joins['b'] parms.join_between = default_joins[3] or '; ' local disp = parms.disp if disp == nil then -- special case for the most common setting parms.joins = default_joins elseif disp == 'x' then -- Later, parms.joins is set from the input parameters. else -- Old template does this. local abbr = parms.abbr if disp == 'slash' then if abbr_entered == nil then disp = 'slash-nbsp' elseif abbr == 'in' or abbr == 'out' then disp = 'slash-sp' else disp = 'slash-nosp' end elseif disp == 'sqbr' then if abbr == 'on' then disp = 'sqbr-nbsp' else disp = 'sqbr-sp' end end parms.joins = disp_joins[disp] or default_joins parms.join_between = parms.joins[3] or parms.join_between parms.wantname = parms.joins.wantname end if (en_default and not parms.opt_lang_local and (parms[1] or ''):find('%d')) or parms.opt_lang_en then from_en_table = nil end if en_default and from_en_table then -- For hiwiki: localized symbol/name is defined with the US symbol/name field, -- and is used if output uses localized numbers. parms.opt_sp_us = true end return true end local function get_values(parms) -- If successful, update parms and return true, v, i where -- v = table of input values -- i = index to next entry in parms after those processed here -- or return false, t where t is an error message table. local valinfo = collection() -- numbered table of input values local range = collection() -- numbered table of range items (having, for example, 2 range items requires 3 input values) local had_nocomma -- true if removed "nocomma" kludge from second parameter (like "tonocomma") local parm2 = strip(parms[2]) if parm2 and parm2:sub(-7, -1) == 'nocomma' then parms[2] = strip(parm2:sub(1, -8)) parms.opt_nocomma = true had_nocomma = true end local function extractor(i) -- If the parameter is not a value, try unpacking it as a range ("1-23" for "1 to 23"). -- However, "-1-2/3" is a negative fraction (-1⅔), so it must be extracted first. -- Do not unpack a parameter if it is like "3-1/2" which is sometimes incorrectly -- used instead of "3+1/2" (and which should not be interpreted as "3 to ½"). -- Unpacked items are inserted into the parms table. -- The tail recursion allows combinations like "1x2 to 3x4". local valstr = strip(parms[i]) -- trim so any '-' as a negative sign will be at start local success, result = extract_number(parms, valstr, i > 1) if not success and valstr and i < 20 then -- check i to limit abuse local lhs, sep, rhs = valstr:match('^(%S+)%s+(%S+)%s+(%S.*)') if lhs and not (sep == '-' and rhs:match('/')) then if sep:find('%d') then return success, result -- to reject {{convert|1 234 567|m}} with a decent message (en only) end parms[i] = rhs table.insert(parms, i, sep) table.insert(parms, i, lhs) return extractor(i) end if not valstr:match('%-.*/') then for _, sep in ipairs(text_code.ranges.words) do local start, stop = valstr:find(sep, 2, true) -- start at 2 to skip any negative sign for range '-' if start then parms[i] = valstr:sub(stop + 1) table.insert(parms, i, sep) table.insert(parms, i, valstr:sub(1, start - 1)) return extractor(i) end end end end return success, result end local i = 1 local is_change while true do local success, info = extractor(i) -- need to set parms.opt_nocomma before calling this if not success then return false, info end i = i + 1 if is_change then info.is_change = true -- value is after "±" and so is a change (significant for range like {{convert|5|±|5|°C}}) is_change = nil end valinfo:add(info) local range_item = get_range(strip(parms[i])) if not range_item then break end i = i + 1 range:add(range_item) if type(range_item) == 'table' then -- For range "x", if append unit to some values, append it to all. parms.in_range_x = parms.in_range_x or range_item.in_range_x parms.out_range_x = parms.out_range_x or range_item.out_range_x parms.abbr_range_x = parms.abbr_range_x or range_item.abbr_range_x is_change = range_item.is_range_change end end if range.n > 0 then if range.n > 30 then -- limit abuse, although 4 is a more likely upper limit return false, { 'cvt_invalid_num' } -- misleading message but it will do end parms.range = range elseif had_nocomma then return false, { 'cvt_unknown', parm2 } end return true, valinfo, i end local function simple_get_values(parms) -- If input is like "{{convert|valid_value|valid_unit|...}}", -- return true, i, in_unit, in_unit_table -- i = index in parms of what follows valid_unit, if anything. -- The valid_value is not negative and does not use a fraction, and -- no options requiring further processing of the input are used. -- Otherwise, return nothing or return false, parm1 for caller to interpret. -- Testing shows this function is successful for 96% of converts in articles, -- and that on average it speeds up converts by 8%. local clean = to_en(strip(parms[1] or ''), parms) if parms.opt_ri or parms.opt_spell_in or #clean > 10 or not clean:match('^[0-9.]+$') then return false, clean end local value = tonumber(clean) if not value then return end local info = { value = value, altvalue = value, singular = (value == 1), clean = clean, show = with_separator(parms, clean), } local in_unit = strip(parms[2]) local success, in_unit_table = lookup(parms, in_unit, 'no_combination') if not success then return end in_unit_table.valinfo = { info } return true, 3, in_unit, in_unit_table end local function wikidata_call(parms, operation, ...) -- Return true, s where s is the result of a Wikidata operation, -- or return false, t where t is an error message table. local function worker(...) wikidata_code = wikidata_code or require(wikidata_module) wikidata_data = wikidata_data or mw.loadData(wikidata_data_module) return wikidata_code[operation](wikidata_data, ...) end local success, status, result = pcall(worker, ...) if success then return status, result end if parms.opt_sortable_debug then -- Use debug=yes to crash if an error while accessing Wikidata. error('Error accessing Wikidata: ' .. status, 0) end return false, { 'cvt_wd_fail' } end local function get_parms(parms, args) -- If successful, update parms and return true, unit where -- parms is a table of all arguments passed to the template -- converted to named arguments, and -- unit is the input unit table; -- or return false, t where t is an error message table. -- For special processing (not a convert), can also return -- true, wikitext where wikitext is the final result. -- The returned input unit table may be for a fake unit using the specified -- unit code as the symbol and name, and with bad_mcode = message code table. -- MediaWiki removes leading and trailing whitespace from the values of -- named arguments. However, the values of numbered arguments include any -- whitespace entered in the template, and whitespace is used by some -- parameters (example: the numbered parameters associated with "disp=x"). local kv_pairs = {} -- table of input key:value pairs where key is a name; needed because cannot iterate parms and add new fields to it for k, v in pairs(args) do if type(k) == 'number' or k == 'test' then -- parameter "test" is reserved for testing and is not translated parms[k] = v else kv_pairs[k] = v end end if parms.test == 'wikidata' then local ulookup = function (ucode) -- Use empty table for parms so it does not accumulate results when used repeatedly. return lookup({}, ucode, 'no_combination') end return wikidata_call(parms, '_listunits', ulookup) end local success, msg = translate_parms(parms, kv_pairs) if not success then return false, msg end if parms.input then success, msg = wikidata_call(parms, '_adjustparameters', parms, 1) if not success then return false, msg end end local success, i, in_unit, in_unit_table = simple_get_values(parms) if not success then if type(i) == 'string' and i:match('^NNN+$') then -- Some infoboxes have examples like {{convert|NNN|m}} (3 or more "N"). -- Output an empty string for these. return false, { 'cvt_no_output' } end local valinfo success, valinfo, i = get_values(parms) if not success then return false, valinfo end in_unit = strip(parms[i]) i = i + 1 success, in_unit_table = lookup(parms, in_unit, 'no_combination') if not success then in_unit = in_unit or '' if parms.opt_ignore_error then -- display given unit code with no error (for use with {{val}}) in_unit_table = '' -- suppress error message and prevent processing of output unit end in_unit_table = setmetatable({ symbol = in_unit, name2 = in_unit, utype = in_unit, scale = 1, default = '', defkey = '', linkey = '', bad_mcode = in_unit_table }, unit_mt) end in_unit_table.valinfo = valinfo end if parms.test == 'msg' then -- Am testing the messages produced when no output unit is specified, and -- the input unit has a missing or invalid default. -- Set two units for testing that. -- LATER: Remove this code. if in_unit == 'chain' then in_unit_table.default = nil -- no default elseif in_unit == 'rd' then in_unit_table.default = "ft!X!m" -- an invalid expression end end in_unit_table.inout = 'in' -- this is an input unit if not parms.range then local success, inext, composite_unit = get_composite(parms, i, in_unit_table) if not success then return false, inext end if composite_unit then in_unit_table = composite_unit i = inext end end if in_unit_table.builtin == 'mach' then -- As with old template, a number following Mach as the input unit is the altitude. -- That is deprecated: should use altitude_ft=NUMBER or altitude_m=NUMBER. local success, info success = tonumber(parms[i]) -- this will often work and will give correct result for values like 2e4 without forcing output scientific notation if success then info = { value = success } else success, info = extract_number(parms, parms[i], false, true) end if success then i = i + 1 in_unit_table.altitude = info.value end end local word = strip(parms[i]) i = i + 1 local precision, is_bad_precision local function set_precision(text) local number, is_integer = get_number(text) if number then if is_integer then precision = number else precision = text is_bad_precision = true end return true -- text was used for precision, good or bad end end if word and not set_precision(word) then parms.out_unit = parms.out_unit or word if set_precision(strip(parms[i])) then i = i + 1 end end if parms.opt_adj_mid then word = parms[i] i = i + 1 if word then -- mid-text words if word:sub(1, 1) == '-' then parms.mid = word else parms.mid = ' ' .. word end end end if parms.opt_one_preunit then parms[parms.opt_flip and 'preunit2' or 'preunit1'] = preunits(1, parms[i]) i = i + 1 end if parms.disp == 'x' then -- Following is reasonably compatible with the old template. local first = parms[i] or '' local second = parms[i+1] or '' i = i + 2 if strip(first) == '' then -- user can enter '&#32;' rather than ' ' to avoid the default first = ' [&nbsp;' .. first second = '&nbsp;]' .. second end parms.joins = { first, second } elseif parms.opt_two_preunits then local p1, p2 = preunits(2, parms[i], parms[i+1]) i = i + 2 if parms.preunit1 then -- To simplify documentation, allow unlikely use of adj=pre with disp=preunit -- (however, an output unit must be specified with adj=pre and with disp=preunit). parms.preunit1 = parms.preunit1 .. p1 parms.preunit2 = p2 else parms.preunit1, parms.preunit2 = p1, p2 end end if precision == nil then if set_precision(strip(parms[i])) then i = i + 1 end end if is_bad_precision then add_warning(parms, 1, 'cvt_bad_prec', precision) else parms.precision = precision end for j = i, i + 3 do local parm = parms[j] -- warn if find a non-empty extraneous parameter if parm and parm:match('%S') then add_warning(parms, 1, 'cvt_unknown_option', parm) break end end return true, in_unit_table end local function record_default_precision(parms, out_current, precision) -- If necessary, adjust parameters and return a possibly adjusted precision. -- When converting a range of values where a default precision is required, -- that default is calculated for each value because the result sometimes -- depends on the precise input and output values. This function may cause -- the entire convert process to be repeated in order to ensure that the -- same default precision is used for each individual convert. -- If that were not done, a range like 1000 to 1000.4 may give poor results -- because the first output could be heavily rounded, while the second is not. -- For range 1000.4 to 1000, this function can give the second convert the -- same default precision that was used for the first. if not parms.opt_round_each then local maxdef = out_current.max_default_precision if maxdef then if maxdef < precision then parms.do_convert_again = true out_current.max_default_precision = precision else precision = out_current.max_default_precision end else out_current.max_default_precision = precision end end return precision end local function default_precision(parms, invalue, inclean, denominator, outvalue, in_current, out_current, extra) -- Return a default value for precision (an integer like 2, 0, -2). -- If denominator is not nil, it is the value of the denominator in inclean. -- Code follows procedures used in old template. local fudge = 1e-14 -- {{Order of magnitude}} adds this, so we do too local prec, minprec, adjust local subunit_ignore_trailing_zero local subunit_more_precision -- kludge for "in" used in input like "|2|ft|6|in" local composite = in_current.composite if composite then subunit_ignore_trailing_zero = true -- input "|2|st|10|lb" has precision 0, not -1 if composite[#composite].exception == 'subunit_more_precision' then subunit_more_precision = true -- do not use standard precision with input like "|2|ft|6|in" end end if denominator and denominator > 0 then prec = math.max(log10(denominator), 1) else -- Count digits after decimal mark, handling cases like '12.345e6'. local exponent local integer, dot, decimals, expstr = inclean:match('^(%d*)(%.?)(%d*)(.*)') local e = expstr:sub(1, 1) if e == 'e' or e == 'E' then exponent = tonumber(expstr:sub(2)) end if dot == '' then prec = subunit_ignore_trailing_zero and 0 or -integer:match('0*$'):len() else prec = #decimals end if exponent then -- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5. prec = prec - exponent end end if in_current.istemperature and out_current.istemperature then -- Converting between common temperatures (°C, °F, °R, K); not keVT. -- Kelvin value can be almost zero, or small but negative due to precision problems. -- Also, an input value like -300 C (below absolute zero) gives negative kelvins. -- Calculate minimum precision from absolute value. adjust = 0 local kelvin = abs((invalue - in_current.offset) * in_current.scale) if kelvin < 1e-8 then -- assume nonzero due to input or calculation precision problem minprec = 2 else minprec = 2 - floor(log10(kelvin) + fudge) -- 3 sigfigs in kelvin end else if invalue == 0 or outvalue <= 0 then -- We are never called with a negative outvalue, but it might be zero. -- This is special-cased to avoid calculation exceptions. return record_default_precision(parms, out_current, 0) end if out_current.exception == 'integer_more_precision' and floor(invalue) == invalue then -- With certain output units that sometimes give poor results -- with default rounding, use more precision when the input -- value is equal to an integer. An example of a poor result -- is when input 50 gives a smaller output than input 49.5. -- Experiment shows this helps, but it does not eliminate all -- surprises because it is not clear whether "50" should be -- interpreted as "from 45 to 55" or "from 49.5 to 50.5". adjust = -log10(in_current.scale) elseif subunit_more_precision then -- Conversion like "{{convert|6|ft|1|in|cm}}" (where subunit is "in") -- has a non-standard adjust value, to give more output precision. adjust = log10(out_current.scale) + 2 else adjust = log10(abs(invalue / outvalue)) end adjust = adjust + log10(2) -- Ensure that the output has at least two significant figures. minprec = 1 - floor(log10(outvalue) + fudge) end if extra then adjust = extra.adjust or adjust minprec = extra.minprec or minprec end return record_default_precision(parms, out_current, math.max(floor(prec + adjust), minprec)) end local function convert(parms, invalue, info, in_current, out_current) -- Convert given input value from one unit to another. -- Return output_value (a number) if a simple convert, or -- return f, t where -- f = true, t = table of information with results, or -- f = false, t = error message table. local inscale = in_current.scale local outscale = out_current.scale if not in_current.iscomplex and not out_current.iscomplex then return invalue * (inscale / outscale) -- minimize overhead for most common case end if in_current.invert or out_current.invert then -- Inverted units, such as inverse length, inverse time, or -- fuel efficiency. Built-in units do not have invert set. if (in_current.invert or 1) * (out_current.invert or 1) < 0 then return 1 / (invalue * inscale * outscale) end return invalue * (inscale / outscale) elseif in_current.offset then -- Temperature (there are no built-ins for this type of unit). if info.is_change then return invalue * (inscale / outscale) end return (invalue - in_current.offset) * (inscale / outscale) + out_current.offset else -- Built-in unit. local in_builtin = in_current.builtin local out_builtin = out_current.builtin if in_builtin and out_builtin then if in_builtin == out_builtin then return invalue end -- There are no cases (yet) where need to convert from one -- built-in unit to another, so this should never occur. return false, { 'cvt_bug_convert' } end if in_builtin == 'mach' or out_builtin == 'mach' then -- Should check that only one altitude is given but am planning to remove -- in_current.altitude (which can only occur when Mach is the input unit), -- and out_current.altitude cannot occur. local alt = parms.altitude_ft or in_current.altitude if not alt and parms.altitude_m then alt = parms.altitude_m / 0.3048 -- 1 ft = 0.3048 m end local spd = speed_of_sound(alt) if in_builtin == 'mach' then inscale = spd return invalue * (inscale / outscale) end outscale = spd local adjust = 0.1 / inscale return true, { outvalue = invalue * (inscale / outscale), adjust = log10(adjust) + log10(2), } elseif in_builtin == 'hand' then -- 1 hand = 4 inches; 1.2 hands = 6 inches. -- Decimals of a hand are only defined for the first digit, and -- the first fractional digit should be a number of inches (1, 2 or 3). -- However, this code interprets the entire fractional part as the number -- of inches / 10 (so 1.75 inches would be 0.175 hands). -- A value like 12.3 hands is exactly 12*4 + 3 inches; base default precision on that. local integer, fracpart = math.modf(invalue) local inch_value = 4 * integer + 10 * fracpart -- equivalent number of inches local factor = inscale / outscale if factor == 4 then -- Am converting to inches: show exact result, and use "inches" not "in" by default. if parms.abbr_org == nil then out_current.usename = true end local show = format('%g', abs(inch_value)) -- show and clean are unsigned if not show:find('e', 1, true) then return true, { invalue = inch_value, outvalue = inch_value, clean = show, show = show, } end end local outvalue = (integer + 2.5 * fracpart) * factor local fracstr = info.clean:match('%.(.*)') or '' local fmt if fracstr == '' then fmt = '%.0f' else fmt = '%.' .. format('%d', #fracstr - 1) .. 'f' end return true, { invalue = inch_value, clean = format(fmt, inch_value), outvalue = outvalue, minprec = 0, } end end return false, { 'cvt_bug_convert' } -- should never occur end local function user_style(parms, i) -- Return text for a user-specified style for a table cell, or '' if none, -- given i = 1 (input style) or 2 (output style). local style = parms[(i == 1) and 'stylein' or 'styleout'] if style then style = style:gsub('"', '') if style ~= '' then if style:sub(-1) ~= ';' then style = style .. ';' end return style end end return '' end local function make_table_or_sort(parms, invalue, info, in_current, scaled_top) -- Set options to handle output for a table or a sort key, or both. -- The text sort key is based on the value resulting from converting -- the input to a fake base unit with scale = 1, and other properties -- required for a conversion derived from the input unit. -- For other modules, return the sort key in a hidden span element, and -- the scaled value used to generate the sort key. -- If scaled_top is set, it is the scaled value of the numerator of a per unit -- to be combined with this unit (the denominator) to make the sort key. -- Scaling only works with units that convert with a factor (not temperature). local sortkey, scaled_value if parms.opt_sortable_on then local base = { -- a fake unit with enough fields for a valid convert scale = 1, invert = in_current.invert and 1, iscomplex = in_current.iscomplex, offset = in_current.offset and 0, } local outvalue, extra = convert(parms, invalue, info, in_current, base) if extra then outvalue = extra.outvalue end if in_current.istemperature then -- Have converted to kelvin; assume numbers close to zero have a -- rounding error and should be zero. if abs(outvalue) < 1e-12 then outvalue = 0 end end if scaled_top and outvalue ~= 0 then outvalue = scaled_top / outvalue end scaled_value = outvalue if not valid_number(outvalue) then if outvalue < 0 then sortkey = '1000000000000000000' else sortkey = '9000000000000000000' end elseif outvalue == 0 then sortkey = '5000000000000000000' else local mag = floor(log10(abs(outvalue)) + 1e-14) local prefix if outvalue > 0 then prefix = 7000 + mag else prefix = 2999 - mag outvalue = outvalue + 10^(mag+1) end sortkey = format('%d', prefix) .. format('%015.0f', floor(outvalue * 10^(14-mag))) end end local sortspan if sortkey and not parms.table_align then sortspan = parms.opt_sortable_debug and '<span data-sort-value="' .. sortkey .. '♠"><span style="border:1px solid">' .. sortkey .. '♠</span></span>' or '<span data-sort-value="' .. sortkey .. '♠"></span>' parms.join_before = sortspan end if parms.table_align then local sort if sortkey then sort = ' data-sort-value="' .. sortkey .. '"' if parms.opt_sortable_debug then parms.join_before = '<span style="border:1px solid">' .. sortkey .. '</span>' end else sort = '' end local style = 'style="text-align:' .. parms.table_align .. ';' local joins = {} for i = 1, 2 do joins[i] = (i == 1 and '' or '\n|') .. style .. user_style(parms, i) .. '"' .. sort .. '|' end parms.table_joins = joins end return sortspan, scaled_value end local cvt_to_hand local function cvtround(parms, info, in_current, out_current) -- Return true, t where t is a table with the conversion results; fields: -- show = rounded, formatted string with the result of converting value in info, -- using the rounding specified in parms. -- singular = true if result (after rounding and ignoring any negative sign) -- is "1", or like "1.00", or is a fraction with value < 1; -- (and more fields shown below, and a calculated 'absvalue' field). -- or return false, t where t is an error message table. -- Input info.clean uses en digits (it has been translated, if necessary). -- Output show uses en or non-en digits as appropriate, or can be spelled. if out_current.builtin == 'hand' then return cvt_to_hand(parms, info, in_current, out_current) end local invalue = in_current.builtin == 'hand' and info.altvalue or info.value local outvalue, extra = convert(parms, invalue, info, in_current, out_current) if parms.need_table_or_sort then parms.need_table_or_sort = nil -- process using first input value only make_table_or_sort(parms, invalue, info, in_current) end if extra then if not outvalue then return false, extra end invalue = extra.invalue or invalue outvalue = extra.outvalue end if not valid_number(outvalue) then return false, { 'cvt_invalid_num' } end local isnegative if outvalue < 0 then isnegative = true outvalue = -outvalue end local precision, show, exponent local denominator = out_current.frac if denominator then show = fraction_table(outvalue, denominator) else precision = parms.precision if not precision then if parms.sigfig then show, exponent = make_sigfig(outvalue, parms.sigfig) elseif parms.opt_round then local n = parms.opt_round if n == 0.5 then local integer, fracpart = math.modf(floor(2 * outvalue + 0.5) / 2) if fracpart == 0 then show = format('%.0f', integer) else show = format('%.1f', integer + fracpart) end else show = format('%.0f', floor((outvalue / n) + 0.5) * n) end elseif in_current.builtin == 'mach' then local sigfig = info.clean:gsub('^[0.]+', ''):gsub('%.', ''):len() + 1 show, exponent = make_sigfig(outvalue, sigfig) else local inclean = info.clean if extra then inclean = extra.clean or inclean show = extra.show end if not show then precision = default_precision(parms, invalue, inclean, info.denominator, outvalue, in_current, out_current, extra) end end end end if precision then if precision >= 0 then local fudge if precision <= 8 then -- Add a fudge to handle common cases of bad rounding due to inability -- to precisely represent some values. This makes the following work: -- {{convert|-100.1|C|K}} and {{convert|5555000|um|m|2}}. -- Old template uses #expr round, which invokes PHP round(). -- LATER: Investigate how PHP round() works. fudge = 2e-14 else fudge = 0 end local fmt = '%.' .. format('%d', precision) .. 'f' local success success, show = pcall(format, fmt, outvalue + fudge) if not success then return false, { 'cvt_big_prec', tostring(precision) } end else precision = -precision -- #digits to zero (in addition to any digits after dot) local shift = 10 ^ precision show = format('%.0f', outvalue/shift) if show ~= '0' then exponent = #show + precision end end end local t = format_number(parms, show, exponent, isnegative) if type(show) == 'string' then -- Set singular using match because on some systems 0.99999999999999999 is 1.0. if exponent then t.singular = (exponent == 1 and show:match('^10*$')) else t.singular = (show == '1' or show:match('^1%.0*$')) end else t.fraction_table = show t.singular = (outvalue <= 1) -- cannot have 'fraction == 1', but if it were possible it would be singular end t.raw_absvalue = outvalue -- absolute value before rounding return true, setmetatable(t, { __index = function (self, key) if key == 'absvalue' then -- Calculate absolute value after rounding, if needed. local clean, exponent = rawget(self, 'clean'), rawget(self, 'exponent') local value = tonumber(clean) -- absolute value (any negative sign has been ignored) if exponent then value = value * 10^exponent end rawset(self, key, value) return value end end }) end function cvt_to_hand(parms, info, in_current, out_current) -- Convert input to hands, inches. -- Return true, t where t is a table with the conversion results; -- or return false, t where t is an error message table. if parms.abbr_org == nil then out_current.usename = true -- default is to show name not symbol end local precision = parms.precision local frac = out_current.frac if not frac and precision and precision > 1 then frac = (precision == 2) and 2 or 4 end local out_next = out_current.out_next if out_next then -- Use magic knowledge to determine whether the next unit is inches without requiring i18n. -- The following ensures that when the output combination "hand in" is used, the inches -- value is rounded to match the hands value. Also, displaying say "61½" instead of 61.5 -- is better as 61.5 implies the value is not 61.4. if out_next.exception == 'subunit_more_precision' then out_next.frac = frac end end -- Convert to inches; calculate hands from that. local dummy_unit_table = { scale = out_current.scale / 4, frac = frac } local success, outinfo = cvtround(parms, info, in_current, dummy_unit_table) if not success then return false, outinfo end local tfrac = outinfo.fraction_table local inches = outinfo.raw_absvalue if tfrac then inches = floor(inches) -- integer part only; fraction added later else inches = floor(inches + 0.5) -- a hands measurement never shows decimals of an inch end local hands, inches = divide(inches, 4) outinfo.absvalue = hands + inches/4 -- supposed to be the absolute rounded value, but this is close enough local inchstr = tostring(inches) -- '0', '1', '2' or '3' if precision and precision <= 0 then -- using negative or 0 for precision rounds to nearest hand hands = floor(outinfo.raw_absvalue/4 + 0.5) inchstr = '' elseif tfrac then -- Always show an integer before fraction (like "15.0½") because "15½" means 15-and-a-half hands. inchstr = numdot .. format_fraction(parms, 'out', false, inchstr, tfrac.numstr, tfrac.denstr) else inchstr = numdot .. from_en(inchstr) end outinfo.show = outinfo.sign .. with_separator(parms, format('%.0f', hands)) .. inchstr return true, outinfo end local function evaluate_condition(value, condition) -- Return true or false from applying a conditional expression to value, -- or throw an error if invalid. -- A very limited set of expressions is supported: -- v < 9 -- v * 9 < 9 -- where -- 'v' is replaced with value -- 9 is any number (as defined by Lua tonumber) -- only en digits are accepted -- '<' can also be '<=' or '>' or '>=' -- In addition, the following form is supported: -- LHS and RHS -- where -- LHS, RHS = any of above expressions. local function compare(value, text) local arithop, factor, compop, limit = text:match('^%s*v%s*([*]?)(.-)([<>]=?)(.*)$') if arithop == nil then error('Invalid default expression', 0) elseif arithop == '*' then factor = tonumber(factor) if factor == nil then error('Invalid default expression', 0) end value = value * factor end limit = tonumber(limit) if limit == nil then error('Invalid default expression', 0) end if compop == '<' then return value < limit elseif compop == '<=' then return value <= limit elseif compop == '>' then return value > limit elseif compop == '>=' then return value >= limit end error('Invalid default expression', 0) -- should not occur end local lhs, rhs = condition:match('^(.-%W)and(%W.*)') if lhs == nil then return compare(value, condition) end return compare(value, lhs) and compare(value, rhs) end local function get_default(value, unit_table) -- Return true, s where s = name of unit's default output unit, -- or return false, t where t is an error message table. -- Some units have a default that depends on the input value -- (the first value if a range of values is used). -- If '!' is in the default, the first bang-delimited field is an -- expression that uses 'v' to represent the input value. -- Example: 'v < 120 ! small ! big ! suffix' (suffix is optional) -- evaluates 'v < 120' as a boolean with result -- 'smallsuffix' if (value < 120), or 'bigsuffix' otherwise. -- Input must use en digits and '.' decimal mark. local default = data_code.default_exceptions[unit_table.defkey or unit_table.symbol] or unit_table.default if not default then local per = unit_table.per if per then local function a_default(v, u) local success, ucode = get_default(v, u) if not success then return '?' -- an unlikely error has occurred; will cause lookup of default to fail end -- Attempt to use only the first unit if a combination or output multiple. -- This is not bulletproof but should work for most cases. -- Where it does not work, the convert will need to specify the wanted output unit. local t = all_units[ucode] if t then local combo = t.combination if combo then -- For a multiple like ftin, the "first" unit (ft) is last in the combination. local i = t.multiple and table_len(combo) or 1 ucode = combo[i] end else -- Try for an automatically generated combination. local item = ucode:match('^(.-)%+') or ucode:match('^(%S+)%s') if all_units[item] then return item end end return ucode end local unit1, unit2 = per[1], per[2] local def1 = (unit1 and a_default(value, unit1) or unit_table.vprefix or '') local def2 = a_default(1, unit2) -- 1 because per unit of denominator return true, def1 .. '/' .. def2 end return false, { 'cvt_no_default', unit_table.symbol } end if default:find('!', 1, true) == nil then return true, default end local t = split(default, '!') if #t == 3 or #t == 4 then local success, result = pcall(evaluate_condition, value, t[1]) if success then default = result and t[2] or t[3] if #t == 4 then default = default .. t[4] end return true, default end end return false, { 'cvt_bad_default', unit_table.symbol } end local linked_pages -- to record linked pages so will not link to the same page more than once local function unlink(unit_table) -- Forget that the given unit has previously been linked (if it has). -- That is needed when processing a range of inputs or outputs when an id -- for the first range value may have been evaluated, but only an id for -- the last value is displayed, and that id may need to be linked. linked_pages[unit_table.unitcode or unit_table] = nil end local function make_link(link, id, unit_table) -- Return wikilink "[[link|id]]", possibly abbreviated as in examples: -- [[Mile|mile]] --> [[mile]] -- [[Mile|miles]] --> [[mile]]s -- However, just id is returned if: -- * no link given (so caller does not need to check if a link was defined); or -- * link has previously been used during the current convert (to avoid overlinking). local link_key if unit_table then link_key = unit_table.unitcode or unit_table else link_key = link end if not link or link == '' or linked_pages[link_key] then return id end linked_pages[link_key] = true -- Following only works for language en, but it should be safe on other wikis, -- and overhead of doing it generally does not seem worthwhile. local l = link:sub(1, 1):lower() .. link:sub(2) if link == id or l == id then return '[[' .. id .. ']]' elseif link .. 's' == id or l .. 's' == id then return '[[' .. id:sub(1, -2) .. ']]s' else return '[[' .. link .. '|' .. id .. ']]' end end local function variable_name(clean, unit_table, exp_multiplier, key_id) -- A unit name may depend on the value in some languages. -- Parameter clean is the unsigned value in en digits, as a string. -- It may represent a number ("1.0") or a fraction ("1+2/3"). -- In varname, fields are separated with "!" and are not empty. -- A field for a unit using an SI prefix has the prefix name inserted, -- replacing '#' if found, or before the field otherwise. if clean:match('[./]') then -- float or fraction if exp_multiplier then clean = exp_multiplier -- force selection of name for a large integer else clean = 34.5 -- force selection of name for a float value end else clean = tonumber(clean) * (exp_multiplier or 1) end local name1, vname if key_id == 'pername' and unit_table.pername then vname = unit_table.pername elseif unit_table.varname then local splitvname = split(unit_table.varname, '!') name1 = unit_table.name1 vname = mw.language.getContentLanguage():convertPlural(clean, name1, unpack(splitvname)) else return clean == 1 and unit_table.name1 or unit_table.name2 end if vname == name1 then -- SI prefix (if any) has been inserted by unit_prefixed_mt. else local si_name = rawget(unit_table, 'si_name') or '' local pos = vname:find('#', 1, true) if pos then vname = vname:sub(1, pos - 1) .. si_name .. vname:sub(pos + 1) else vname = si_name .. vname end end return vname end local function linked_id(parms, unit_table, key_id, want_link, clean, exp_multiplier) -- Return final unit id (symbol or name), optionally with a wikilink, -- and update unit_table.sep if required. -- key_id is one of: 'symbol', 'sym_us', 'name1', 'name1_us', 'name2', 'name2_us', 'pername'. local abbr_on = (key_id == 'symbol' or key_id == 'sym_us') if abbr_on and want_link then local symlink = rawget(unit_table, 'symlink') if symlink then return symlink -- for exceptions that have the linked symbol built-in end end local multiplier = rawget(unit_table, 'multiplier') local per = unit_table.per if per then local paren1, paren2 = '', '' -- possible parentheses around bottom unit local unit1 = per[1] -- top unit_table, or nil local unit2 = per[2] -- bottom unit_table if abbr_on then if not unit1 then unit_table.sep = '' -- no separator in "$2/acre" end if not want_link then local symbol = unit_table.symbol_raw if symbol then return symbol -- for exceptions that have the symbol built-in end end if (unit2.symbol):find('⋅', 1, true) then paren1, paren2 = '(', ')' end end local key_id2 -- unit2 is always singular if key_id == 'name2' then key_id2 = 'name1' elseif key_id == 'name2_us' then key_id2 = 'name1_us' else key_id2 = key_id end if key_id2 == 'name1' or key_id2 == 'name1_us' then key_id2 = unit2.pername and 'pername' or key_id2 -- ukwiki has some units with a different name in "per unitname" end local result if abbr_on then result = '/' elseif omitsep then result = per_word elseif unit1 then result = ' ' .. per_word .. ' ' else result = per_word .. ' ' end if want_link and unit_table.link then if varname and not abbr_on then result = (unit1 and variable_name(clean, unit1, exp_multiplier) or '') .. result .. variable_name('1', unit2, exp_multiplier, key_id2) else result = (unit1 and linked_id(parms, unit1, key_id, false, clean) or '') .. result .. linked_id(parms, unit2, key_id2, false, '1') end if omit_separator(result) then unit_table.sep = '' end return make_link(unit_table.link, result, unit_table) end if unit1 then result = linked_id(parms, unit1, key_id, want_link, clean) .. result if unit1.sep then unit_table.sep = unit1.sep end elseif omitsep then unit_table.sep = '' end return result .. paren1 .. linked_id(parms, unit2, key_id2, want_link, '1') .. paren2 end if multiplier then -- A multiplier (like "100" in "100km") forces the unit to be plural. multiplier = from_en(multiplier) if not omitsep then multiplier = multiplier .. (abbr_on and '&nbsp;' or ' ') end if not abbr_on then if key_id == 'name1' then key_id = 'name2' elseif key_id == 'name1_us' then key_id = 'name2_us' end end else multiplier = '' end local id = unit_table.fixed_name or ((varname and not abbr_on) and variable_name(clean, unit_table, exp_multiplier, key_id) or unit_table[key_id]) if omit_separator(id) then unit_table.sep = '' end if want_link then local link = data_code.link_exceptions[unit_table.linkey or unit_table.symbol] or unit_table.link if link then local before = '' local i = unit_table.customary if i == 1 and parms.opt_sp_us then i = 2 -- show "U.S." not "US" end if i == 3 and abbr_on then i = 4 -- abbreviate "imperial" to "imp" end local customary = text_code.customary_units[i] if customary then -- LATER: This works for language en only, but it's esoteric so ignore for now. local pertext if id:sub(1, 1) == '/' then -- Want unit "/USgal" to display as "/U.S. gal", not "U.S. /gal". pertext = '/' id = id:sub(2) elseif id:sub(1, 4) == 'per ' then -- Similarly want "per U.S. gallon", not "U.S. per gallon" (but in practice this is unlikely to be used). pertext = 'per ' id = id:sub(5) else pertext = '' end -- Omit any "US"/"U.S."/"imp"/"imperial" from start of id since that will be inserted. local removes = (i < 3) and { 'US&nbsp;', 'US ', 'U.S.&nbsp;', 'U.S. ' } or { 'imp&nbsp;', 'imp ', 'imperial ' } for _, prefix in ipairs(removes) do local plen = #prefix if id:sub(1, plen) == prefix then id = id:sub(plen + 1) break end end before = pertext .. make_link(customary.link, customary[1]) .. ' ' end id = before .. make_link(link, id, unit_table) end end return multiplier .. id end local function make_id(parms, which, unit_table) -- Return id, f where -- id = unit name or symbol, possibly modified -- f = true if id is a name, or false if id is a symbol -- using the value for index 'which', and for 'in' or 'out' (unit_table.inout). -- Result is '' if no symbol/name is to be used. -- In addition, set unit_table.sep = ' ' or '&nbsp;' or '' -- (the separator that caller will normally insert before the id). if parms.opt_values then unit_table.sep = '' return '' end local inout = unit_table.inout local info = unit_table.valinfo[which] local lk = parms.lk local want_link = (lk == 'on' or lk == inout) local singular = info.singular local want_name local exp_multiplier if unit_table.usename then want_name = true else if parms.abbr_org == nil then if parms.wantname then want_name = true end if unit_table.usesymbol then want_name = false end end if want_name == nil then local abbr = parms.abbr if abbr == 'on' or abbr == inout or (abbr == 'mos' and inout == 'out') then want_name = false else want_name = true end end end local key if want_name then if lk == nil and unit_table.builtin == 'hand' then want_link = true end if parms.opt_use_nbsp then unit_table.sep = '&nbsp;' else unit_table.sep = ' ' end if parms.opt_singular then local value if inout == 'in' then value = info.value else value = info.absvalue end if value then -- some unusual units do not always set value field value = abs(value) singular = (0 < value and value < 1.0001) end end if unit_table.engscale then -- engscale: so "|1|e3kg" gives "1 thousand kilograms" (plural) singular = false exp_multiplier = 10^unit_table.engscale.exponent -- '1 gram' and '1 thousand grams', for example, may use different names for the unit in some languages end key = (parms.opt_adjectival or singular) and 'name1' or 'name2' if parms.opt_sp_us then key = key .. '_us' end else if unit_table.builtin == 'hand' then if parms.opt_hand_hh then unit_table.symbol = 'hh' -- LATER: might want i18n applied to this end end unit_table.sep = '&nbsp;' key = parms.opt_sp_us and 'sym_us' or 'symbol' end return linked_id(parms, unit_table, key, want_link, info.clean, exp_multiplier), want_name end local function decorate_value(parms, unit_table, which, enable_number_word) -- If needed, update unit_table so values will be shown with extra information. -- For consistency with the old template (but different from fmtpower), -- the style to display powers of 10 includes "display:none" to allow some -- browsers to copy, for example, "10³" as "10^3", rather than as "103". -- The engscale table may have entries such as either of the following: -- ["3"] = { "thousand", exponent = 3 }, -- ["3"] = { name1 = "A", varname = "B!C!D", exponent = 3 }, -- The first option always uses "thousand" as the exponent name. -- The second option uses one of A, B, C, D as the exponent name, depending on the value. local info local engscale = unit_table.engscale local prefix = unit_table.vprefix if engscale or prefix then info = unit_table.valinfo[which] if info.decorated then return -- do not redecorate if repeating convert end info.decorated = true if engscale then -- Range |10|-|20|e3km| gives '10×10³–20×10³' or '10–20 thousand'. local inout = unit_table.inout local abbr = parms.abbr if (abbr == 'on' or abbr == inout) and not (unit_table.this_number_word or parms.number_word) then info.show = info.show .. '<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' .. from_en('10') .. '</span></span><s style="display:none">^</s><sup>' .. from_en(tostring(engscale.exponent)) .. '</sup>' elseif enable_number_word then local number_id local name = engscale.varname and variable_name(info.clean, engscale) or engscale[1] if parms.lk == 'on' or parms.lk == inout then number_id = make_link(engscale.link, name) else number_id = name end -- WP:NUMERAL recommends "&nbsp;" in values like "12 million". info.show = info.show .. (parms.opt_adjectival and '-' or '&nbsp;') .. number_id end end if prefix then info.show = prefix .. info.show end end end local function process_input(parms, in_current) -- Processing required once per conversion. -- Return block of text to represent input (value/unit). if parms.opt_output_only or parms.opt_output_number_only or parms.opt_output_unit_only then parms.joins = { '', '' } return '' end local first_unit local composite = in_current.composite -- nil or table of units if composite then first_unit = composite[1] else first_unit = in_current end local id1, want_name = make_id(parms, 1, first_unit) local sep = first_unit.sep -- separator between value and unit, set by make_id local preunit = parms.preunit1 if preunit then sep = '' -- any separator is included in preunit else preunit = '' end if parms.opt_input_unit_only then parms.joins = { '', '' } if composite then local parts = { id1 } for i, unit in ipairs(composite) do if i > 1 then table.insert(parts, (make_id(parms, 1, unit))) end end id1 = table.concat(parts, ' ') end if want_name and parms.opt_adjectival then return preunit .. hyphenated(id1) end return preunit .. id1 end if parms.opt_also_symbol and not composite and not parms.opt_flip then local join1 = parms.joins[1] if join1 == ' (' or join1 == ' [' then parms.joins = { ' [' .. first_unit[parms.opt_sp_us and 'sym_us' or 'symbol'] .. ']' .. join1 , parms.joins[2] } end end if in_current.builtin == 'mach' and first_unit.sep ~= '' then -- '' means omitsep with non-enwiki name local prefix = id1 .. '&nbsp;' local range = parms.range local valinfo = first_unit.valinfo local result = prefix .. valinfo[1].show if range then -- For simplicity and because more not needed, handle one range item only. local prefix2 = make_id(parms, 2, first_unit) .. '&nbsp;' result = range_text(range[1], want_name, parms, result, prefix2 .. valinfo[2].show, 'in', {spaced=true}) end return preunit .. result end if composite then -- Simplify: assume there is no range, and no decoration. local mid = (not parms.opt_flip) and parms.mid or '' local sep1 = '&nbsp;' local sep2 = ' ' if parms.opt_adjectival and want_name then sep1 = '-' sep2 = '-' end if omitsep and sep == '' then -- Testing the id of the most significant unit should be sufficient. sep1 = '' sep2 = '' end local parts = { first_unit.valinfo[1].show .. sep1 .. id1 } for i, unit in ipairs(composite) do if i > 1 then table.insert(parts, unit.valinfo[1].show .. sep1 .. (make_id(parms, 1, unit))) end end return table.concat(parts, sep2) .. mid end local add_unit = (parms.abbr == 'mos') or parms[parms.opt_flip and 'out_range_x' or 'in_range_x'] or (not want_name and parms.abbr_range_x) local range = parms.range if range and not add_unit then unlink(first_unit) end local id = range and make_id(parms, range.n + 1, first_unit) or id1 local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, 'in') if was_hyphenated then add_unit = false end local result local valinfo = first_unit.valinfo if range then for i = 0, range.n do local enable_number_word if i == range.n then add_unit = false enable_number_word = true end decorate_value(parms, first_unit, i+1, enable_number_word) local show = valinfo[i+1].show if add_unit then show = show .. first_unit.sep .. (i == 0 and id1 or make_id(parms, i+1, first_unit)) end if i == 0 then result = show else result = range_text(range[i], want_name, parms, result, show, 'in') end end else decorate_value(parms, first_unit, 1, true) result = valinfo[1].show end return result .. preunit .. extra end local function process_one_output(parms, out_current) -- Processing required for each output unit. -- Return block of text to represent output (value/unit). local inout = out_current.inout -- normally 'out' but can be 'in' for order=out local id1, want_name = make_id(parms, 1, out_current) local sep = out_current.sep -- set by make_id local preunit = parms.preunit2 if preunit then sep = '' -- any separator is included in preunit else preunit = '' end if parms.opt_output_unit_only then if want_name and parms.opt_adjectival then return preunit .. hyphenated(id1) end return preunit .. id1 end if out_current.builtin == 'mach' and out_current.sep ~= '' then -- '' means omitsep with non-enwiki name local prefix = id1 .. '&nbsp;' local range = parms.range local valinfo = out_current.valinfo local result = prefix .. valinfo[1].show if range then -- For simplicity and because more not needed, handle one range item only. result = range_text(range[1], want_name, parms, result, prefix .. valinfo[2].show, inout, {spaced=true}) end return preunit .. result end local add_unit = (parms[parms.opt_flip and 'in_range_x' or 'out_range_x'] or (not want_name and parms.abbr_range_x)) and not parms.opt_output_number_only local range = parms.range if range and not add_unit then unlink(out_current) end local id = range and make_id(parms, range.n + 1, out_current) or id1 local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, inout) if was_hyphenated then add_unit = false end local result local valinfo = out_current.valinfo if range then for i = 0, range.n do local enable_number_word if i == range.n then add_unit = false enable_number_word = true end decorate_value(parms, out_current, i+1, enable_number_word) local show = valinfo[i+1].show if add_unit then show = show .. out_current.sep .. (i == 0 and id1 or make_id(parms, i+1, out_current)) end if i == 0 then result = show else result = range_text(range[i], want_name, parms, result, show, inout) end end else decorate_value(parms, out_current, 1, true) result = valinfo[1].show end if parms.opt_output_number_only then return result end return result .. preunit .. extra end local function make_output_single(parms, in_unit_table, out_unit_table) -- Return true, item where item = wikitext of the conversion result -- for a single output (which is not a combination or a multiple); -- or return false, t where t is an error message table. if parms.opt_order_out and in_unit_table.unitcode == out_unit_table.unitcode then out_unit_table.valinfo = in_unit_table.valinfo else out_unit_table.valinfo = collection() for _, v in ipairs(in_unit_table.valinfo) do local success, info = cvtround(parms, v, in_unit_table, out_unit_table) if not success then return false, info end out_unit_table.valinfo:add(info) end end return true, process_one_output(parms, out_unit_table) end local function make_output_multiple(parms, in_unit_table, out_unit_table) -- Return true, item where item = wikitext of the conversion result -- for an output which is a multiple (like 'ftin'); -- or return false, t where t is an error message table. local inout = out_unit_table.inout -- normally 'out' but can be 'in' for order=out local multiple = out_unit_table.multiple -- table of scaling factors (will not be nil) local combos = out_unit_table.combination -- table of unit tables (will not be nil) local abbr = parms.abbr local abbr_org = parms.abbr_org local disp = parms.disp local want_name = (abbr_org == nil and (disp == 'or' or disp == 'slash')) or not (abbr == 'on' or abbr == inout or abbr == 'mos') local want_link = (parms.lk == 'on' or parms.lk == inout) local mid = parms.opt_flip and parms.mid or '' local sep1 = '&nbsp;' local sep2 = ' ' if parms.opt_adjectival and want_name then sep1 = '-' sep2 = '-' end local do_spell = parms.opt_spell_out parms.opt_spell_out = nil -- so the call to cvtround does not spell the value local function make_result(info, isfirst) local fmt, outvalue, sign local results = {} for i = 1, #combos do local tfrac, thisvalue, strforce local out_current = combos[i] out_current.inout = inout local scale = multiple[i] if i == 1 then -- least significant unit ('in' from 'ftin') local decimals out_current.frac = out_unit_table.frac local success, outinfo = cvtround(parms, info, in_unit_table, out_current) if not success then return false, outinfo end if isfirst then out_unit_table.valinfo = { outinfo } -- in case output value of first least significant unit is needed end sign = outinfo.sign tfrac = outinfo.fraction_table if outinfo.is_scientific then strforce = outinfo.show decimals = '' elseif tfrac then decimals = '' else local show = outinfo.show -- number as a string in local language local p1, p2 = show:find(numdot, 1, true) decimals = p1 and show:sub(p2 + 1) or '' -- text after numdot, if any end fmt = '%.' .. ulen(decimals) .. 'f' -- to reproduce precision if decimals == '' then if tfrac then outvalue = floor(outinfo.raw_absvalue) -- integer part only; fraction added later else outvalue = floor(outinfo.raw_absvalue + 0.5) -- keep all integer digits of least significant unit end else outvalue = outinfo.absvalue end end if scale then outvalue, thisvalue = divide(outvalue, scale) else thisvalue = outvalue end local id if want_name then if varname then local clean if strforce or tfrac then clean = '.1' -- dummy value to force name for floating point else clean = format(fmt, thisvalue) end id = variable_name(clean, out_current) else local key = 'name2' if parms.opt_adjectival then key = 'name1' elseif tfrac then if thisvalue == 0 then key = 'name1' end elseif parms.opt_singular then if 0 < thisvalue and thisvalue < 1.0001 then key = 'name1' end else if thisvalue == 1 then key = 'name1' end end id = out_current[key] end else id = out_current['symbol'] end if i == 1 and omit_separator(id) then -- Testing the id of the least significant unit should be sufficient. sep1 = '' sep2 = '' end if want_link then local link = out_current.link if link then id = make_link(link, id, out_current) end end local strval local spell_inout = (i == #combos or outvalue == 0) and inout or '' -- trick so the last value processed (first displayed) has uppercase, if requested if strforce and outvalue == 0 then sign = '' -- any sign is in strforce strval = strforce -- show small values in scientific notation; will only use least significant unit elseif tfrac then local wholestr = (thisvalue > 0) and tostring(thisvalue) or nil strval = format_fraction(parms, spell_inout, false, wholestr, tfrac.numstr, tfrac.denstr, do_spell) else strval = (thisvalue == 0) and from_en('0') or with_separator(parms, format(fmt, thisvalue)) if do_spell then strval = spell_number(parms, spell_inout, strval) or strval end end table.insert(results, strval .. sep1 .. id) if outvalue == 0 then break end fmt = '%.0f' -- only least significant unit can have a non-integral value end local reversed, count = {}, #results for i = 1, count do reversed[i] = results[count + 1 - i] end return true, sign .. table.concat(reversed, sep2) end local valinfo = in_unit_table.valinfo local success, result = make_result(valinfo[1], true) if not success then return false, result end local range = parms.range if range then for i = 1, range.n do local success, result2 = make_result(valinfo[i+1]) if not success then return false, result2 end result = range_text(range[i], want_name, parms, result, result2, inout, {spaced=true}) end end return true, result .. mid end local function process(parms, in_unit_table, out_unit_table) -- Return true, s, outunit where s = final wikitext result, -- or return false, t where t is an error message table. linked_pages = {} local success, bad_output local bad_input_mcode = in_unit_table.bad_mcode -- nil if input unit is a valid convert unit local out_unit = parms.out_unit if out_unit == nil or out_unit == '' or type(out_unit) == 'function' then -- out_unit can be set to a function by adjustparameters in Module:Convert/wikidata. if bad_input_mcode or parms.opt_input_unit_only then bad_output = '' else local getdef = type(out_unit) == 'function' and out_unit or get_default success, out_unit = getdef(in_unit_table.valinfo[1].value, in_unit_table) parms.out_unit = out_unit if not success then bad_output = out_unit end end end if not bad_output and not out_unit_table then success, out_unit_table = lookup(parms, out_unit, 'any_combination') if success then local mismatch = check_mismatch(in_unit_table, out_unit_table) if mismatch then bad_output = mismatch end else bad_output = out_unit_table end end local lhs, rhs local flipped = parms.opt_flip and not bad_input_mcode if bad_output then rhs = (bad_output == '') and '' or message(parms, bad_output) elseif parms.opt_input_unit_only then rhs = '' else local combos -- nil (for 'ft' or 'ftin'), or table of unit tables (for 'm ft') if not out_unit_table.multiple then -- nil/false ('ft' or 'm ft'), or table of factors ('ftin') combos = out_unit_table.combination end local frac = parms.frac -- nil or denominator of fraction for output values if frac then -- Apply fraction to the unit (if only one), or to non-SI units (if a combination), -- except that if a precision is also specified, the fraction only applies to -- the hand unit; that allows the following result: -- {{convert|156|cm|in hand|1|frac=2}} → 156 centimetres (61.4 in; 15.1½ hands) -- However, the following is handled elsewhere as a special case: -- {{convert|156|cm|hand in|1|frac=2}} → 156 centimetres (15.1½ hands; 61½ in) if combos then local precision = parms.precision for _, unit in ipairs(combos) do if unit.builtin == 'hand' or (not precision and not unit.prefixes) then unit.frac = frac end end else out_unit_table.frac = frac end end local outputs = {} local imax = combos and #combos or 1 -- 1 (single unit) or number of unit tables if imax == 1 then parms.opt_order_out = nil -- only useful with an output combination end if not flipped and not parms.opt_order_out then -- Process left side first so any duplicate links (from lk=on) are suppressed -- on right. Example: {{convert|28|e9pc|e9ly|abbr=off|lk=on}} lhs = process_input(parms, in_unit_table) end for i = 1, imax do local success, item local out_current = combos and combos[i] or out_unit_table out_current.inout = 'out' if i == 1 then if imax > 1 and out_current.builtin == 'hand' then out_current.out_next = combos[2] -- built-in hand can influence next unit in a combination end if parms.opt_order_out then out_current.inout = 'in' end end if out_current.multiple then success, item = make_output_multiple(parms, in_unit_table, out_current) else success, item = make_output_single(parms, in_unit_table, out_current) end if not success then return false, item end outputs[i] = item end if parms.opt_order_out then lhs = outputs[1] table.remove(outputs, 1) end local sep = parms.table_joins and parms.table_joins[2] or parms.join_between rhs = table.concat(outputs, sep) end if flipped or not lhs then local input = process_input(parms, in_unit_table) if flipped then lhs = rhs rhs = input else lhs = input end end if parms.join_before then lhs = parms.join_before .. lhs end local wikitext if bad_input_mcode then if bad_input_mcode == '' then wikitext = lhs else wikitext = lhs .. message(parms, bad_input_mcode) end elseif parms.table_joins then wikitext = parms.table_joins[1] .. lhs .. parms.table_joins[2] .. rhs else wikitext = lhs .. parms.joins[1] .. rhs .. parms.joins[2] end if parms.warnings and not bad_input_mcode then wikitext = wikitext .. parms.warnings end return true, get_styles(parms) .. wikitext, out_unit_table end local function _main_convert(confArgs, parmsArgs, frame) -- Do convert, and if needed, do it again with higher default precision. local parms = { frame = frame or mw.getCurrentFrame() } -- will hold template arguments, after translation set_config(confArgs) local success, result = get_parms(parms, parmsArgs) if success then if type(result) ~= 'table' then return tostring(result) end local in_unit_table = result local out_unit_table for _ = 1, 2 do -- use counter so cannot get stuck repeating convert success, result, out_unit_table = process(parms, in_unit_table, out_unit_table) if success and parms.do_convert_again then parms.do_convert_again = false else break end end end -- If input=x gives a problem, the result should be just the user input -- (if x is a property like P123 it has been replaced with ''). -- An unknown input unit would display the input and an error message -- with success == true at this point. -- Also, can have success == false with a message that outputs an empty string. if parms.input_text then if success and not parms.have_problem then return result end local cat if parms.tracking then -- Add a tracking category using the given text as the category sort key. -- There is currently only one type of tracking, but in principle multiple -- items could be tracked, using different sort keys for convenience. cat = wanted_category('tracking', parms.tracking) end return parms.input_text .. (cat or '') end return success and result or message(parms, result) end local function main_convert(frame) return _main_convert(frame.args, frame:getParent().args, frame) end local function _unit(unitcode, options) -- Helper function for Module:Val to look up a unit. -- Parameter unitcode must be a string to identify the wanted unit. -- Parameter options must be nil or a table with optional fields: -- value = number (for sort key; default value is 1) -- scaled_top = nil for a normal unit, or a number for a unit which is -- the denominator of a per unit (for sort key) -- si = { 'symbol', 'link' } -- (a table with two strings) to make an SI unit -- that will be used for the look up -- link = true if result should be [[linked]] -- sort = 'on' or 'debug' if result should include a sort key in a -- span element ('debug' makes the key visible) -- name = true for the name of the unit instead of the symbol -- us = true for the US spelling of the unit, if any -- Return nil if unitcode is not a non-empty string. -- Otherwise return a table with fields: -- text = requested symbol or name of unit, optionally linked -- scaled_value = input value adjusted by unit scale; used for sort key -- sortspan = span element with sort key like that provided by {{ntsh}}, -- calculated from the result of converting value -- to a base unit with scale 1. -- unknown = true if the unitcode was not known unitcode = strip(unitcode) if unitcode == nil or unitcode == '' then return nil end set_config({}) linked_pages = {} options = options or {} local parms = { abbr = options.name and 'off' or 'on', lk = options.link and 'on' or nil, opt_sp_us = options.us and true or nil, opt_ignore_error = true, -- do not add pages using this function to 'what links here' for Module:Convert/extra opt_sortable_on = options.sort == 'on' or options.sort == 'debug', opt_sortable_debug = options.sort == 'debug', } if options.si then -- Make a dummy table of units (just one unit) for lookup to use. -- This makes lookup recognize any SI prefix in the unitcode. local symbol = options.si[1] or '?' parms.unittable = { [symbol] = { _name1 = symbol, _name2 = symbol, _symbol = symbol, utype = symbol, scale = symbol == 'g' and 0.001 or 1, prefixes = 1, default = symbol, link = options.si[2], }} end local success, unit_table = lookup(parms, unitcode, 'no_combination') if not success then unit_table = setmetatable({ symbol = unitcode, name2 = unitcode, utype = unitcode, scale = 1, default = '', defkey = '', linkey = '' }, unit_mt) end local value = tonumber(options.value) or 1 local clean = tostring(abs(value)) local info = { value = value, altvalue = value, singular = (clean == '1'), clean = clean, show = clean, } unit_table.inout = 'in' unit_table.valinfo = { info } local sortspan, scaled_value if options.sort then sortspan, scaled_value = make_table_or_sort(parms, value, info, unit_table, options.scaled_top) end return { text = make_id(parms, 1, unit_table), sortspan = sortspan, scaled_value = scaled_value, unknown = not success and true or nil, } end return { convert = main_convert, _convert = _main_convert, _unit = _unit } 84ef1800df9ddbc24da3d295d74282d1c59ec2b5 Module:Convert/data 828 721 1106 1105 2025-08-22T00:55:51Z Sharparam 284703 1 revision imported Scribunto text/plain -- Conversion data used by [[Module:Convert]] which uses mw.loadData() for -- read-only access to this module so that it is loaded only once per page. -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. -- -- These data tables follow: -- all_units all properties for a unit, including default output -- default_exceptions exceptions for default output ('kg' and 'g' have different defaults) -- link_exceptions exceptions for links ('kg' and 'g' have different links) -- -- These tables are generated by a script which reads the wikitext of a page that -- documents the required properties of each unit; see [[:en:Module:Convert/doc]]. --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local all_units = { ["Gy"] = { _name1 = "gray", _symbol = "Gy", utype = "absorbed radiation dose", scale = 1, prefixes = 1, default = "rad", link = "Gray (unit)", }, ["rad"] = { _name1 = "rad", _symbol = "rad", utype = "absorbed radiation dose", scale = 0.01, prefixes = 1, default = "Gy", link = "Rad (unit)", }, ["cm/s2"] = { name1 = "centimetre per second squared", name1_us = "centimeter per second squared", name2 = "centimetres per second squared", name2_us = "centimeters per second squared", symbol = "cm/s<sup>2</sup>", utype = "acceleration", scale = 0.01, default = "ft/s2", link = "Gal (unit)", }, ["ft/s2"] = { name1 = "foot per second squared", name2 = "feet per second squared", symbol = "ft/s<sup>2</sup>", utype = "acceleration", scale = 0.3048, default = "m/s2", }, ["g0"] = { name1 = "standard gravity", name2 = "standard gravities", symbol = "''g''<sub>0</sub>", utype = "acceleration", scale = 9.80665, default = "m/s2", }, ["g-force"] = { name2 = "''g''", symbol = "''g''", utype = "acceleration", scale = 9.80665, default = "m/s2", link = "g-force", }, ["km/hs"] = { name1 = "kilometre per hour per second", name1_us = "kilometer per hour per second", name2 = "kilometres per hour per second", name2_us = "kilometers per hour per second", symbol = "km/(h⋅s)", utype = "acceleration", scale = 0.27777777777777779, default = "mph/s", link = "Acceleration", }, ["km/s2"] = { name1 = "kilometre per second squared", name1_us = "kilometer per second squared", name2 = "kilometres per second squared", name2_us = "kilometers per second squared", symbol = "km/s<sup>2</sup>", utype = "acceleration", scale = 1000, default = "mph/s", link = "Acceleration", }, ["m/s2"] = { name1 = "metre per second squared", name1_us = "meter per second squared", name2 = "metres per second squared", name2_us = "meters per second squared", symbol = "m/s<sup>2</sup>", utype = "acceleration", scale = 1, default = "ft/s2", }, ["mph/s"] = { name1 = "mile per hour per second", name2 = "miles per hour per second", symbol = "mph/s", utype = "acceleration", scale = 0.44704, default = "km/hs", link = "Acceleration", }, ["km/h/s"] = { target = "km/hs", }, ["standard gravity"] = { target = "g0", }, ["1000sqft"] = { name1 = "thousand square feet", name2 = "thousand square feet", symbol = "1000&nbsp;sq&nbsp;ft", utype = "area", scale = 92.90304, default = "m2", link = "Square foot", }, ["a"] = { _name1 = "are", _symbol = "a", utype = "area", scale = 100, prefixes = 1, default = "sqft", link = "Hectare#Are", }, ["acre"] = { symbol = "acre", usename = 1, utype = "area", scale = 4046.8564224, default = "ha", subdivs = { ["rood"] = { 4, default = "ha" }, ["sqperch"] = { 160, default = "ha" } }, }, ["acre-sing"] = { target = "acre", }, ["arpent"] = { symbol = "arpent", usename = 1, utype = "area", scale = 3418.89, default = "ha", }, ["cda"] = { name1 = "cuerda", symbol = "cda", utype = "area", scale = 3930.395625, default = "ha acre", }, ["daa"] = { name1 = "decare", symbol = "daa", utype = "area", scale = 1000, default = "km2 sqmi", }, ["dunam"] = { symbol = "dunam", usename = 1, utype = "area", scale = 1000, default = "km2 sqmi", }, ["dunum"] = { symbol = "dunum", usename = 1, utype = "area", scale = 1000, default = "km2 sqmi", link = "Dunam", }, ["ha"] = { name1 = "hectare", symbol = "ha", utype = "area", scale = 10000, default = "acre", }, ["hectare"] = { name1 = "hectare", symbol = "ha", usename = 1, utype = "area", scale = 10000, default = "acre", }, ["Irish acre"] = { name1 = "Irish acre", symbol = "Irish&nbsp;acres", utype = "area", scale = 6555.2385024, default = "ha", link = "Acre (Irish)", }, ["m2"] = { _name1 = "square metre", _name1_us= "square meter", _symbol = "m<sup>2</sup>", prefix_position= 8, utype = "area", scale = 1, prefixes = 2, default = "sqft", link = "Square metre", }, ["pondemaat"] = { name1 = "pondemaat", name2 = "pondemaat", symbol = "pond", utype = "area", scale = 3674.363358816, default = "m2", link = ":nl:pondemaat", }, ["pyeong"] = { name2 = "pyeong", symbol = "pyeong", usename = 1, utype = "area", scale = 3.3057851239669422, default = "m2", }, ["rai"] = { name2 = "rai", symbol = "rai", utype = "area", scale = 1600, default = "m2", link = "Rai (unit)", }, ["rood"] = { symbol = "rood", usename = 1, utype = "area", scale = 1011.7141056, default = "sqft m2", subdivs = { ["sqperch"] = { 40, default = "m2" } }, link = "Rood (unit)", }, ["sqfoot"] = { name1 = "square foot", name2 = "square foot", symbol = "sq&nbsp;ft", utype = "area", scale = 0.09290304, default = "m2", }, ["sqft"] = { name1 = "square foot", name2 = "square feet", symbol = "sq&nbsp;ft", utype = "area", scale = 0.09290304, default = "m2", }, ["sqin"] = { name1 = "square inch", name2 = "square inches", symbol = "sq&nbsp;in", utype = "area", scale = 0.00064516, default = "cm2", }, ["sqmi"] = { name1 = "square mile", symbol = "sq&nbsp;mi", utype = "area", scale = 2589988.110336, default = "km2", }, ["sqnmi"] = { name1 = "square nautical mile", symbol = "sq&nbsp;nmi", utype = "area", scale = 3429904, default = "km2 sqmi", link = "Nautical mile", }, ["sqperch"] = { name2 = "perches", symbol = "perch", usename = 1, utype = "area", scale = 25.29285264, default = "m2", link = "Rod (unit)#Area and volume", }, ["sqverst"] = { symbol = "square verst", usename = 1, utype = "area", scale = 1138062.24, default = "km2 sqmi", link = "Verst", }, ["sqyd"] = { name1 = "square yard", symbol = "sq&nbsp;yd", utype = "area", scale = 0.83612736, default = "m2", }, ["tsubo"] = { name2 = "tsubo", symbol = "tsubo", usename = 1, utype = "area", scale = 3.3057851239669422, default = "m2", link = "Japanese units of measurement#Area", }, ["acres"] = { target = "acre", }, ["are"] = { target = "a", }, ["decare"] = { target = "daa", }, ["foot2"] = { target = "sqfoot", }, ["ft2"] = { target = "sqft", }, ["in2"] = { target = "sqin", symbol = "in<sup>2</sup>", }, ["km²"] = { target = "km2", }, ["mi2"] = { target = "sqmi", }, ["million acre"] = { target = "e6acre", }, ["million acres"] = { target = "e6acre", }, ["million hectares"] = { target = "e6ha", }, ["m²"] = { target = "m2", }, ["nmi2"] = { target = "sqnmi", }, ["pond"] = { target = "pondemaat", }, ["sq arp"] = { target = "arpent", }, ["sqkm"] = { target = "km2", }, ["sqm"] = { target = "m2", }, ["square verst"] = { target = "sqverst", }, ["verst2"] = { target = "sqverst", }, ["yd2"] = { target = "sqyd", }, ["m2/ha"] = { name1 = "square metre per hectare", name1_us = "square meter per hectare", name2 = "square metres per hectare", name2_us = "square meters per hectare", symbol = "m<sup>2</sup>/ha", utype = "area per unit area", scale = 0.0001, default = "sqft/acre", link = "Basal area", }, ["sqft/acre"] = { name1 = "square foot per acre", name2 = "square feet per acre", symbol = "sq&nbsp;ft/acre", utype = "area per unit area", scale = 2.295684113865932e-5, default = "m2/ha", link = "Basal area", }, ["cent"] = { name1 = "cent", symbol = "¢", utype = "cent", scale = 1, default = "cent", link = "Cent (currency)", }, ["¢"] = { target = "cent", }, ["A.h"] = { name1 = "ampere hour", symbol = "A⋅h", utype = "charge", scale = 3600, default = "coulomb", }, ["coulomb"] = { _name1 = "coulomb", _symbol = "C", utype = "charge", scale = 1, prefixes = 1, default = "e", link = "Coulomb", }, ["e"] = { name1 = "elementary charge", symbol = "''e''", utype = "charge", scale = 1.602176487e-19, default = "coulomb", }, ["g-mol"] = { name1 = "gram-mole", symbol = "g&#8209;mol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["gmol"] = { name1 = "gram-mole", symbol = "gmol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["kmol"] = { name1 = "kilomole", symbol = "kmol", utype = "chemical amount", scale = 1000, default = "lbmol", link = "Mole (unit)", }, ["lb-mol"] = { name1 = "pound-mole", symbol = "lb&#8209;mol", utype = "chemical amount", scale = 453.59237, default = "mol", }, ["lbmol"] = { name1 = "pound-mole", symbol = "lbmol", utype = "chemical amount", scale = 453.59237, default = "mol", }, ["mol"] = { name1 = "mole", symbol = "mol", utype = "chemical amount", scale = 1, default = "lbmol", link = "Mole (unit)", }, ["kgCO2/L"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg(CO<sub>2</sub>)/L", utype = "co2 per unit volume", scale = 1000, default = "lbCO2/USgal", link = "Exhaust gas", }, ["lbCO2/USgal"] = { name1 = "pound per US gallon", name2 = "pounds per US gallon", symbol = "lbCO2/US&nbsp;gal", utype = "co2 per unit volume", scale = 119.82642731689663, default = "kgCO2/L", link = "Exhaust gas", }, ["oz/lb"] = { per = { "oz", "lb" }, utype = "concentration", default = "mg/kg", }, ["mg/kg"] = { per = { "mg", "kg" }, utype = "concentration", default = "oz/lb", }, ["g/dm3"] = { name1 = "gram per cubic decimetre", name1_us = "gram per cubic decimeter", name2 = "grams per cubic decimetre", name2_us = "grams per cubic decimeter", symbol = "g/dm<sup>3</sup>", utype = "density", scale = 1, default = "kg/m3", link = "Density", }, ["g/L"] = { name1 = "gram per litre", name1_us = "gram per liter", name2 = "grams per litre", name2_us = "grams per liter", symbol = "g/L", utype = "density", scale = 1, default = "lb/cuin", link = "Density", }, ["g/mL"] = { name1 = "gram per millilitre", name1_us = "gram per milliliter", name2 = "grams per millilitre", name2_us = "grams per milliliter", symbol = "g/mL", utype = "density", scale = 1000, default = "lb/cuin", link = "Density", }, ["g/ml"] = { name1 = "gram per millilitre", name1_us = "gram per milliliter", name2 = "grams per millilitre", name2_us = "grams per milliliter", symbol = "g/ml", utype = "density", scale = 1000, default = "lb/cuin", link = "Density", }, ["kg/dm3"] = { name1 = "kilogram per cubic decimetre", name1_us = "kilogram per cubic decimeter", name2 = "kilograms per cubic decimetre", name2_us = "kilograms per cubic decimeter", symbol = "kg/dm<sup>3</sup>", utype = "density", scale = 1000, default = "lb/cuft", link = "Density", }, ["kg/L"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg/L", utype = "density", scale = 1000, default = "lb/USgal", link = "Density", }, ["kg/l"] = { name1 = "kilogram per litre", name1_us = "kilogram per liter", name2 = "kilograms per litre", name2_us = "kilograms per liter", symbol = "kg/l", utype = "density", scale = 1000, default = "lb/USgal", link = "Density", }, ["kg/m3"] = { name1 = "kilogram per cubic metre", name1_us = "kilogram per cubic meter", name2 = "kilograms per cubic metre", name2_us = "kilograms per cubic meter", symbol = "kg/m<sup>3</sup>", utype = "density", scale = 1, default = "lb/cuyd", link = "Density", }, ["lb/cuft"] = { name1 = "pound per cubic foot", name2 = "pounds per cubic foot", symbol = "lb/cu&nbsp;ft", utype = "density", scale = 16.018463373960142, default = "g/cm3", link = "Density", }, ["lb/cuin"] = { name1 = "pound per cubic inch", name2 = "pounds per cubic inch", symbol = "lb/cu&nbsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["lb/cuyd"] = { name1 = "pound per cubic yard", name2 = "pounds per cubic yard", symbol = "lb/cu&nbsp;yd", utype = "density", scale = 0.5932764212577829, default = "kg/m3", link = "Density", }, ["lb/impgal"] = { name1 = "pound per imperial gallon", name2 = "pounds per imperial gallon", symbol = "lb/imp&nbsp;gal", utype = "density", scale = 99.776372663101697, default = "kg/L", link = "Density", }, ["lb/in3"] = { name1 = "pound per cubic inch", name2 = "pounds per cubic inch", symbol = "lb/cu&thinsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["lb/U.S.gal"] = { name1 = "pound per U.S. gallon", name2 = "pounds per U.S. gallon", symbol = "lb/U.S.&nbsp;gal", utype = "density", scale = 119.82642731689663, default = "kg/L", link = "Density", }, ["lb/USbu"] = { name1 = "pound per US bushel", name2 = "pounds per US bushel", symbol = "lb/US&nbsp;bu", utype = "density", scale = 12.871859780974471, default = "kg/m3", link = "Bushel", }, ["lb/USgal"] = { name1 = "pound per US gallon", name2 = "pounds per US gallon", symbol = "lb/US&nbsp;gal", utype = "density", scale = 119.82642731689663, default = "kg/L", link = "Density", }, ["lbm/cuin"] = { name1 = "pound mass per cubic inch", name2 = "pounds mass per cubic inch", symbol = "lbm/cu&thinsp;in", utype = "density", scale = 27679.904710203122, default = "g/cm3", link = "Density", }, ["mg/L"] = { name1 = "milligram per litre", name1_us = "milligram per liter", name2 = "milligrams per litre", name2_us = "milligrams per liter", symbol = "mg/L", utype = "density", scale = 0.001, default = "lb/cuin", link = "Density", }, ["oz/cuin"] = { name1 = "ounce per cubic inch", name2 = "ounces per cubic inch", symbol = "oz/cu&nbsp;in", utype = "density", scale = 1729.9940443876951, default = "g/cm3", link = "Density", }, ["g/cm3"] = { per = { "g", "cm3" }, utype = "density", default = "lb/cuin", }, ["g/m3"] = { per = { "g", "m3" }, utype = "density", default = "lb/cuyd", link = "Density", }, ["Mg/m3"] = { per = { "Mg", "m3" }, utype = "density", default = "lb/cuft", }, ["mg/l"] = { per = { "mg", "ll" }, utype = "density", default = "oz/cuin", }, ["μg/dL"] = { per = { "μg", "dL" }, utype = "density", default = "lb/cuin", }, ["μg/l"] = { per = { "μg", "ll" }, utype = "density", default = "oz/cuin", }, ["lb/ft3"] = { target = "lb/cuft", }, ["lb/yd3"] = { target = "lb/cuyd", }, ["lbm/in3"] = { target = "lbm/cuin", }, ["mcg/dL"] = { target = "μg/dL", }, ["oz/in3"] = { target = "oz/cuin", }, ["ug/dL"] = { target = "μg/dL", }, ["ug/l"] = { target = "μg/l", }, ["B.O.T.U."] = { name1 = "Board of Trade Unit", symbol = "B.O.T.U.", utype = "energy", scale = 3600000, default = "MJ", link = "Kilowatt-hour", }, ["bboe"] = { name1 = "barrel of oil equivalent", name2 = "barrels of oil equivalent", symbol = "bboe", utype = "energy", scale = 6117863200, default = "GJ", }, ["BOE"] = { name1 = "barrel of oil equivalent", name2 = "barrels of oil equivalent", symbol = "BOE", utype = "energy", scale = 6117863200, default = "GJ", }, ["BTU"] = { name1 = "British thermal unit", symbol = "BTU", utype = "energy", scale = 1055.05585262, default = "kJ", }, ["Btu"] = { name1 = "British thermal unit", symbol = "Btu", utype = "energy", scale = 1055.05585262, default = "kJ", }, ["BTU-39F"] = { name1 = "British thermal unit (39°F)", name2 = "British thermal units (39°F)", symbol = "BTU<sub>39°F</sub>", utype = "energy", scale = 1059.67, default = "kJ", link = "British thermal unit", }, ["Btu-39F"] = { name1 = "British thermal unit (39°F)", name2 = "British thermal units (39°F)", symbol = "Btu<sub>39°F</sub>", utype = "energy", scale = 1059.67, default = "kJ", link = "British thermal unit", }, ["BTU-59F"] = { name1 = "British thermal unit (59°F)", name2 = "British thermal units (59°F)", symbol = "BTU<sub>59°F</sub>", utype = "energy", scale = 1054.804, default = "kJ", link = "British thermal unit", }, ["Btu-59F"] = { name1 = "British thermal unit (59°F)", name2 = "British thermal units (59°F)", symbol = "Btu<sub>59°F</sub>", utype = "energy", scale = 1054.804, default = "kJ", link = "British thermal unit", }, ["BTU-60F"] = { name1 = "British thermal unit (60°F)", name2 = "British thermal units (60°F)", symbol = "BTU<sub>60°F</sub>", utype = "energy", scale = 1054.68, default = "kJ", link = "British thermal unit", }, ["Btu-60F"] = { name1 = "British thermal unit (60°F)", name2 = "British thermal units (60°F)", symbol = "Btu<sub>60°F</sub>", utype = "energy", scale = 1054.68, default = "kJ", link = "British thermal unit", }, ["BTU-63F"] = { name1 = "British thermal unit (63°F)", name2 = "British thermal units (63°F)", symbol = "BTU<sub>63°F</sub>", utype = "energy", scale = 1054.6, default = "kJ", link = "British thermal unit", }, ["Btu-63F"] = { name1 = "British thermal unit (63°F)", name2 = "British thermal units (63°F)", symbol = "Btu<sub>63°F</sub>", utype = "energy", scale = 1054.6, default = "kJ", link = "British thermal unit", }, ["BTU-ISO"] = { name1 = "British thermal unit (ISO)", name2 = "British thermal units (ISO)", symbol = "BTU<sub>ISO</sub>", utype = "energy", scale = 1055.056, default = "kJ", link = "British thermal unit", }, ["Btu-ISO"] = { target = "BTU-ISO", }, ["BTU-IT"] = { name1 = "British thermal unit (IT)", name2 = "British thermal units (IT)", symbol = "BTU<sub>IT</sub>", utype = "energy", scale = 1055.05585262, default = "kJ", link = "British thermal unit", }, ["Btu-IT"] = { name1 = "British thermal unit (IT)", name2 = "British thermal units (IT)", symbol = "Btu<sub>IT</sub>", utype = "energy", scale = 1055.05585262, default = "kJ", link = "British thermal unit", }, ["BTU-mean"] = { name1 = "British thermal unit (mean)", name2 = "British thermal units (mean)", symbol = "BTU<sub>mean</sub>", utype = "energy", scale = 1055.87, default = "kJ", link = "British thermal unit", }, ["Btu-mean"] = { name1 = "British thermal unit (mean)", name2 = "British thermal units (mean)", symbol = "Btu<sub>mean</sub>", utype = "energy", scale = 1055.87, default = "kJ", link = "British thermal unit", }, ["BTU-th"] = { name1 = "British thermal unit (thermochemical)", name2 = "British thermal units (thermochemical)", symbol = "BTU<sub>th</sub>", utype = "energy", scale = 1054.35026444, default = "kJ", link = "British thermal unit", }, ["Btu-th"] = { name1 = "British thermal unit (thermochemical)", name2 = "British thermal units (thermochemical)", symbol = "Btu<sub>th</sub>", utype = "energy", scale = 1054.35026444, default = "kJ", link = "British thermal unit", }, ["Cal"] = { name1 = "calorie", symbol = "Cal", utype = "energy", scale = 4184, default = "kJ", }, ["cal"] = { name1 = "calorie", symbol = "cal", utype = "energy", scale = 4.184, default = "J", }, ["Cal-15"] = { name1 = "Calorie (15°C)", name2 = "Calories (15°C)", symbol = "Cal<sub>15</sub>", utype = "energy", scale = 4185.8, default = "kJ", link = "Calorie", }, ["cal-15"] = { name1 = "calorie (15°C)", name2 = "calories (15°C)", symbol = "cal<sub>15</sub>", utype = "energy", scale = 4.1858, default = "J", link = "Calorie", }, ["Cal-IT"] = { name1 = "Calorie (International Steam Table)", name2 = "Calories (International Steam Table)", symbol = "Cal<sub>IT</sub>", utype = "energy", scale = 4186.8, default = "kJ", link = "Calorie", }, ["cal-IT"] = { name1 = "calorie (International Steam Table)", name2 = "calories (International Steam Table)", symbol = "cal<sub>IT</sub>", utype = "energy", scale = 4.1868, default = "J", link = "Calorie", }, ["Cal-th"] = { name1 = "Calorie (thermochemical)", name2 = "Calories (thermochemical)", symbol = "Cal<sub>th</sub>", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["cal-th"] = { name1 = "calorie (thermochemical)", name2 = "calories (thermochemical)", symbol = "cal<sub>th</sub>", utype = "energy", scale = 4.184, default = "J", link = "Calorie", }, ["CHU-IT"] = { name1 = "Celsius heat unit (International Table)", name2 = "Celsius heat units (International Table)", symbol = "CHU<sub>IT</sub>", utype = "energy", scale = 1899.100534716, default = "kJ", link = "Conversion of units#Energy", }, ["cufootnaturalgas"] = { name1 = "cubic foot of natural gas", name2 = "cubic foot of natural gas", symbol = "cuftnaturalgas", usename = 1, utype = "energy", scale = 1055055.85262, default = "MJ", link = "Conversion of units#Energy", }, ["cuftnaturalgas"] = { name1 = "cubic foot of natural gas", name2 = "cubic feet of natural gas", symbol = "cuftnaturalgas", usename = 1, utype = "energy", scale = 1055055.85262, default = "MJ", link = "Conversion of units#Energy", }, ["Eh"] = { name1 = "Hartree", symbol = "''E''<sub>h</sub>", utype = "energy", scale = 4.35974417e-18, default = "eV", }, ["erg"] = { symbol = "erg", utype = "energy", scale = 0.0000001, default = "μJ", }, ["eV"] = { name1 = "electronvolt", symbol = "eV", utype = "energy", scale = 1.602176487e-19, default = "aJ", }, ["feV"] = { name1 = "femtoelectronvolt", symbol = "feV", utype = "energy", scale = 1.602176487e-34, default = "yJ", link = "Electronvolt", }, ["foe"] = { symbol = "foe", utype = "energy", scale = 1e44, default = "YJ", link = "Foe (unit)", }, ["ftlb"] = { name1 = "foot-pound", symbol = "ft⋅lb", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftlb-f"] = { name1 = "foot-pound force", name2 = "foot-pounds force", symbol = "ft⋅lb<sub>f</sub>", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftlbf"] = { name1 = "foot-pound force", name2 = "foot-pounds force", symbol = "ft⋅lbf", utype = "energy", alttype = "torque", scale = 1.3558179483314004, default = "J", link = "Foot-pound (energy)", }, ["ftpdl"] = { name1 = "foot-poundal", symbol = "ft⋅pdl", utype = "energy", scale = 0.0421401100938048, default = "J", }, ["GeV"] = { name1 = "gigaelectronvolt", symbol = "GeV", utype = "energy", scale = 1.602176487e-10, default = "nJ", link = "Electronvolt", }, ["gTNT"] = { name2 = "grams of TNT", symbol = "gram of TNT", usename = 1, utype = "energy", scale = 4184, default = "kJ", link = "TNT equivalent", }, ["Gtoe"] = { name1 = "gigatonne of oil equivalent", name2 = "gigatonnes of oil equivalent", symbol = "Gtoe", utype = "energy", scale = 4.1868e19, default = "EJ", link = "Tonne of oil equivalent", }, ["GtonTNT"] = { name2 = "gigatons of TNT", symbol = "gigaton of TNT", usename = 1, utype = "energy", scale = 4.184e18, default = "EJ", link = "TNT equivalent", }, ["GtTNT"] = { name2 = "gigatonnes of TNT", symbol = "gigatonne of TNT", usename = 1, utype = "energy", scale = 4.184e18, default = "EJ", link = "TNT equivalent", }, ["GW.h"] = { name1 = "gigawatt-hour", symbol = "GW⋅h", utype = "energy", scale = 3.6e12, default = "TJ", link = "Kilowatt-hour", }, ["GWh"] = { name1 = "gigawatt-hour", symbol = "GWh", utype = "energy", scale = 3.6e12, default = "TJ", link = "Kilowatt-hour", }, ["hph"] = { name1 = "horsepower-hour", symbol = "hp⋅h", utype = "energy", scale = 2684519.537696172792, default = "kWh", link = "Horsepower", }, ["inlb"] = { name1 = "inch-pound", symbol = "in⋅lb", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inlb-f"] = { name1 = "inch-pound force", name2 = "inch-pounds force", symbol = "in⋅lb<sub>f</sub>", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inlbf"] = { name1 = "inch-pound force", name2 = "inch-pounds force", symbol = "in⋅lbf", utype = "energy", alttype = "torque", scale = 0.1129848290276167, default = "mJ", link = "Foot-pound (energy)", }, ["inoz-f"] = { name1 = "inch-ounce force", name2 = "inch-ounces force", symbol = "in⋅oz<sub>f</sub>", utype = "energy", alttype = "torque", scale = 0.00706155181422604375, default = "mJ", link = "Foot-pound (energy)", }, ["inozf"] = { name1 = "inch-ounce force", name2 = "inch-ounces force", symbol = "in⋅ozf", utype = "energy", alttype = "torque", scale = 0.00706155181422604375, default = "mJ", link = "Foot-pound (energy)", }, ["J"] = { _name1 = "joule", _symbol = "J", utype = "energy", scale = 1, prefixes = 1, default = "cal", link = "Joule", }, ["kBOE"] = { name1 = "kilo barrel of oil equivalent", name2 = "kilo barrels of oil equivalent", symbol = "kBOE", utype = "energy", scale = 6.1178632e12, default = "TJ", link = "Barrel of oil equivalent", }, ["kcal"] = { name1 = "kilocalorie", symbol = "kcal", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["kcal-15"] = { name1 = "kilocalorie (15°C)", name2 = "kilocalories (15°C)", symbol = "kcal<sub>15</sub>", utype = "energy", scale = 4185.8, default = "kJ", link = "Calorie", }, ["kcal-IT"] = { name1 = "kilocalorie (International Steam Table)", name2 = "kilocalories (International Steam Table)", symbol = "kcal<sub>IT</sub>", utype = "energy", scale = 4186.8, default = "kJ", link = "Calorie", }, ["kcal-th"] = { name1 = "kilocalorie (thermochemical)", name2 = "kilocalories (thermochemical)", symbol = "kcal<sub>th</sub>", utype = "energy", scale = 4184, default = "kJ", link = "Calorie", }, ["kerg"] = { name1 = "kiloerg", symbol = "kerg", utype = "energy", scale = 0.0001, default = "mJ", link = "Erg", }, ["keV"] = { name1 = "kiloelectronvolt", symbol = "keV", utype = "energy", scale = 1.602176487e-16, default = "fJ", link = "Electronvolt", }, ["kgTNT"] = { name2 = "kilograms of TNT", symbol = "kilogram of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["kt(TNT)"] = { name1 = "kilotonne", name1_us = "kiloton", symbol = "kt", utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["ktoe"] = { name1 = "kilotonne of oil equivalent", name2 = "kilotonnes of oil equivalent", symbol = "ktoe", utype = "energy", scale = 4.1868e13, default = "TJ", link = "Tonne of oil equivalent", }, ["ktonTNT"] = { name1 = "kiloton of TNT", name2 = "kilotons of TNT", symbol = "kt", utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["ktTNT"] = { name2 = "kilotonnes of TNT", symbol = "kilotonne of TNT", usename = 1, utype = "energy", scale = 4.184e12, default = "TJ", link = "TNT equivalent", }, ["kW.h"] = { name1 = "kilowatt-hour", symbol = "kW⋅h", utype = "energy", scale = 3600000, default = "MJ", }, ["kWh"] = { name1 = "kilowatt-hour", symbol = "kWh", utype = "energy", scale = 3600000, default = "MJ", }, ["Mcal"] = { name1 = "megacalorie", symbol = "Mcal", utype = "energy", scale = 4184000, default = "MJ", link = "Calorie", }, ["mcal"] = { name1 = "millicalorie", symbol = "mcal", utype = "energy", scale = 0.004184, default = "mJ", link = "Calorie", }, ["Mcal-15"] = { name1 = "megacalorie (15°C)", name2 = "megacalories (15°C)", symbol = "Mcal<sub>15</sub>", utype = "energy", scale = 4185800, default = "MJ", link = "Calorie", }, ["mcal-15"] = { name1 = "millicalorie (15°C)", name2 = "millicalories (15°C)", symbol = "mcal<sub>15</sub>", utype = "energy", scale = 0.0041858, default = "mJ", link = "Calorie", }, ["Mcal-IT"] = { name1 = "megacalorie (International Steam Table)", name2 = "megacalories (International Steam Table)", symbol = "Mcal<sub>IT</sub>", utype = "energy", scale = 4186800, default = "MJ", link = "Calorie", }, ["mcal-IT"] = { name1 = "millicalorie (International Steam Table)", name2 = "millicalories (International Steam Table)", symbol = "mcal<sub>IT</sub>", utype = "energy", scale = 0.0041868, default = "mJ", link = "Calorie", }, ["Mcal-th"] = { name1 = "megacalorie (thermochemical)", name2 = "megacalories (thermochemical)", symbol = "Mcal<sub>th</sub>", utype = "energy", scale = 4184000, default = "MJ", link = "Calorie", }, ["mcal-th"] = { name1 = "millicalorie (thermochemical)", name2 = "millicalories (thermochemical)", symbol = "mcal<sub>th</sub>", utype = "energy", scale = 0.004184, default = "mJ", link = "Calorie", }, ["Merg"] = { name1 = "megaerg", symbol = "Merg", utype = "energy", scale = 0.1, default = "J", link = "Erg", }, ["merg"] = { name1 = "millierg", symbol = "merg", utype = "energy", scale = 0.0000000001, default = "μJ", link = "Erg", }, ["MeV"] = { name1 = "megaelectronvolt", symbol = "MeV", utype = "energy", scale = 1.602176487e-13, default = "pJ", link = "Electronvolt", }, ["meV"] = { name1 = "millielectronvolt", symbol = "meV", utype = "energy", scale = 1.602176487e-22, default = "zJ", link = "Electronvolt", }, ["MMBtu"] = { name1 = "million British thermal units", name2 = "million British thermal units", symbol = "MMBtu", utype = "energy", scale = 1055055852.62, default = "GJ", link = "British thermal unit", }, ["Mt(TNT)"] = { name1 = "megatonne", name1_us = "megaton", symbol = "Mt", utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["Mtoe"] = { name1 = "megatonne of oil equivalent", name2 = "megatonnes of oil equivalent", symbol = "Mtoe", utype = "energy", scale = 4.1868e16, default = "PJ", link = "Tonne of oil equivalent", }, ["MtonTNT"] = { name1 = "megaton of TNT", name2 = "megatons of TNT", symbol = "Mt", utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["mtonTNT"] = { name2 = "millitons of TNT", symbol = "milliton of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["MtTNT"] = { name2 = "megatonnes of TNT", symbol = "megatonne of TNT", usename = 1, utype = "energy", scale = 4.184e15, default = "PJ", link = "TNT equivalent", }, ["mtTNT"] = { name2 = "millitonnes of TNT", symbol = "millitonne of TNT", usename = 1, utype = "energy", scale = 4184000, default = "MJ", link = "TNT equivalent", }, ["MW.h"] = { name1 = "megawatt-hour", symbol = "MW⋅h", utype = "energy", scale = 3600000000, default = "GJ", link = "Kilowatt-hour", }, ["mW.h"] = { name1 = "milliwatt-hour", symbol = "mW⋅h", utype = "energy", scale = 3.6, default = "J", link = "Kilowatt-hour", }, ["MWh"] = { name1 = "megawatt-hour", symbol = "MWh", utype = "energy", scale = 3600000000, default = "GJ", link = "Kilowatt-hour", }, ["mWh"] = { name1 = "milliwatt-hour", symbol = "mWh", utype = "energy", scale = 3.6, default = "J", link = "Kilowatt-hour", }, ["neV"] = { name1 = "nanoelectronvolt", symbol = "neV", utype = "energy", scale = 1.602176487e-28, default = "yJ", link = "Electronvolt", }, ["PeV"] = { name1 = "petaelectronvolt", symbol = "PeV", utype = "energy", scale = 0.0001602176487, default = "mJ", link = "Electronvolt", }, ["peV"] = { name1 = "picoelectronvolt", symbol = "peV", utype = "energy", scale = 1.602176487e-31, default = "yJ", link = "Electronvolt", }, ["PSh"] = { name1 = "Pferdestärkenstunde", symbol = "PSh", utype = "energy", scale = 2647795.5, default = "kWh", }, ["quad"] = { name1 = "quadrillion British thermal units", name2 = "quadrillion British thermal units", symbol = "quad", utype = "energy", scale = 1.054804e18, default = "EJ", link = "Quad (unit)", }, ["Ry"] = { name1 = "rydberg", symbol = "Ry", utype = "energy", scale = 2.1798741e-18, default = "eV", link = "Rydberg constant", }, ["scf"] = { name1 = "standard cubic foot", name2 = "standard cubic feet", symbol = "scf", utype = "energy", scale = 2869.2044809344, default = "kJ", }, ["scfoot"] = { name1 = "standard cubic foot", name2 = "standard cubic foot", symbol = "scf", utype = "energy", scale = 2869.2044809344, default = "kJ", }, ["t(TNT)"] = { name1 = "tonne", name1_us = "ton", symbol = "t", utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["TeV"] = { name1 = "teraelectronvolt", symbol = "TeV", utype = "energy", scale = 1.602176487e-7, default = "μJ", link = "Electronvolt", }, ["th"] = { name1 = "thermie", symbol = "th", utype = "energy", scale = 4186800, default = "MJ", link = "Conversion of units#Energy", }, ["thm-EC"] = { name1 = "therm (EC)", name2 = "therms (EC)", symbol = "thm (EC)", utype = "energy", scale = 105506000, default = "MJ", link = "Therm", }, ["thm-UK"] = { name1 = "therm (UK)", name2 = "therms (UK)", symbol = "thm (UK)", utype = "energy", scale = 105505585.257348, default = "MJ", link = "Therm", }, ["thm-US"] = { name1 = "therm (US)", name1_us = "therm (U.S.)", name2 = "therms (US)", name2_us = "therms (U.S.)", symbol = "thm (US)", sym_us = "thm (U.S.)", utype = "energy", scale = 105480400, default = "MJ", link = "Therm", }, ["toe"] = { name1 = "tonne of oil equivalent", name2 = "tonnes of oil equivalent", symbol = "toe", utype = "energy", scale = 41868000000, default = "GJ", }, ["tonTNT"] = { name2 = "tons of TNT", symbol = "ton of TNT", usename = 1, utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["tTNT"] = { name2 = "tonnes of TNT", symbol = "tonne of TNT", usename = 1, utype = "energy", scale = 4184000000, default = "GJ", link = "TNT equivalent", }, ["TtonTNT"] = { name2 = "teratons of TNT", symbol = "teraton of TNT", usename = 1, utype = "energy", scale = 4.184e21, default = "ZJ", link = "TNT equivalent", }, ["TtTNT"] = { name2 = "teratonnes of TNT", symbol = "teratonne of TNT", usename = 1, utype = "energy", scale = 4.184e21, default = "ZJ", link = "TNT equivalent", }, ["TW.h"] = { name1 = "terawatt-hour", symbol = "TW⋅h", utype = "energy", scale = 3.6e15, default = "PJ", link = "Kilowatt-hour", }, ["TWh"] = { name1 = "terawatt-hour", symbol = "TWh", utype = "energy", scale = 3.6e15, default = "PJ", link = "Kilowatt-hour", }, ["W.h"] = { name1 = "watt-hour", symbol = "W⋅h", utype = "energy", scale = 3600, default = "kJ", link = "Kilowatt-hour", }, ["Wh"] = { name1 = "watt-hour", symbol = "Wh", utype = "energy", scale = 3600, default = "kJ", link = "Kilowatt-hour", }, ["μerg"] = { name1 = "microerg", symbol = "μerg", utype = "energy", scale = 1e-13, default = "nJ", link = "Erg", }, ["μeV"] = { name1 = "microelectronvolt", symbol = "μeV", utype = "energy", scale = 1.602176487e-25, default = "yJ", link = "Electronvolt", }, ["μW.h"] = { name1 = "microwatt-hour", symbol = "μW⋅h", utype = "energy", scale = 0.0036, default = "mJ", link = "Kilowatt-hour", }, ["μWh"] = { name1 = "microwatt-hour", symbol = "μWh", utype = "energy", scale = 0.0036, default = "mJ", link = "Kilowatt-hour", }, ["-kW.h"] = { target = "kW.h", link = "Kilowatt hour", }, ["btu"] = { target = "BTU", }, ["Calorie"] = { target = "Cal", }, ["ft.lbf"] = { target = "ftlbf", }, ["ft·lbf"] = { target = "ftlbf", }, ["g-cal-15"] = { target = "cal-15", }, ["g-cal-IT"] = { target = "cal-IT", }, ["g-cal-th"] = { target = "cal-th", }, ["g-kcal-15"] = { target = "kcal-15", }, ["g-kcal-IT"] = { target = "kcal-IT", }, ["g-kcal-th"] = { target = "kcal-th", }, ["g-Mcal-15"] = { target = "Mcal-15", }, ["g-mcal-15"] = { target = "mcal-15", }, ["g-Mcal-IT"] = { target = "Mcal-IT", }, ["g-mcal-IT"] = { target = "mcal-IT", }, ["g-Mcal-th"] = { target = "Mcal-th", }, ["g-mcal-th"] = { target = "mcal-th", }, ["GW-h"] = { target = "GW.h", }, ["GW·h"] = { target = "GW.h", }, ["Hartree"] = { target = "Eh", }, ["hp.h"] = { target = "hph", }, ["in.lb-f"] = { target = "inlb-f", }, ["in.lbf"] = { target = "inlbf", }, ["in.oz-f"] = { target = "inoz-f", }, ["in.ozf"] = { target = "inozf", }, ["kbboe"] = { target = "kBOE", symbol = "kbboe", }, ["kg-cal-15"] = { target = "Cal-15", }, ["kg-cal-IT"] = { target = "Cal-IT", }, ["kg-cal-th"] = { target = "Cal-th", }, ["kW-h"] = { target = "kW.h", }, ["kW·h"] = { target = "kW.h", }, ["MW-h"] = { target = "MW.h", }, ["mW-h"] = { target = "mW.h", }, ["MW·h"] = { target = "MW.h", }, ["TW-h"] = { target = "TW.h", }, ["uerg"] = { target = "μerg", }, ["ueV"] = { target = "μeV", }, ["uW-h"] = { target = "μW.h", }, ["uW.h"] = { target = "μW.h", }, ["uWh"] = { target = "μWh", }, ["W-h"] = { target = "W.h", }, ["eVpar"] = { _name1 = "electronvolt", _symbol = "eV", utype = "energy per chemical amount", scale = 96485.329522144166, prefixes = 1, default = "kcal/mol", link = "Electronvolt", }, ["kcal/mol"] = { per = { "kcal", "mol" }, utype = "energy per chemical amount", default = "kJ/mol", link = "Kilocalorie per mole", }, ["kJ/mol"] = { per = { "kJ", "mol" }, utype = "energy per chemical amount", default = "kcal/mol", link = "Joule per mole", }, ["kWh/100 km"] = { name1 = "kilowatt-hour per 100 kilometres", name1_us = "kilowatt-hour per 100 kilometers", name2 = "kilowatt-hours per 100 kilometres", name2_us = "kilowatt-hours per 100 kilometers", symbol = "kW⋅h/100&nbsp;km", utype = "energy per unit length", scale = 36, default = "MJ/km kWh/mi", link = "Kilowatt-hour", }, ["kWh/100 mi"] = { name1 = "kilowatt-hour per 100 miles", name2 = "kilowatt-hours per 100 miles", symbol = "kW⋅h/100&nbsp;mi", utype = "energy per unit length", scale = 22.3694, default = "mpge", link = "Miles per gallon gasoline equivalent", }, ["MJ/100 km"] = { name1 = "megajoule per 100 kilometres", name1_us = "megajoule per 100 kilometers", name2 = "megajoules per 100 kilometres", name2_us = "megajoules per 100 kilometers", symbol = "MJ/100&nbsp;km", utype = "energy per unit length", scale = 10, default = "BTU/mi", link = "British thermal unit", }, ["mpge"] = { name1 = "mile per gallon gasoline equivalent", name2 = "miles per gallon gasoline equivalent", symbol = "mpg&#8209;e", utype = "energy per unit length", scale = 1.3263314048360777e-5, invert = -1, iscomplex= true, default = "kWh/100 mi", link = "Miles per gallon gasoline equivalent", }, ["BTU/mi"] = { per = { "BTU", "mi" }, utype = "energy per unit length", default = "v > 1525 ! M ! k ! J/km", }, ["kJ/km"] = { per = { "kJ", "km" }, utype = "energy per unit length", default = "BTU/mi", }, ["kWh/km"] = { per = { "-kW.h", "km" }, utype = "energy per unit length", default = "MJ/km kWh/mi", }, ["kWh/mi"] = { per = { "-kW.h", "mi" }, utype = "energy per unit length", default = "kWh/km MJ/km", }, ["MJ/km"] = { per = { "MJ", "km" }, utype = "energy per unit length", default = "BTU/mi", }, ["mpg-e"] = { target = "mpge", }, ["BTU/lb"] = { name1 = "British thermal unit per pound", name2 = "British thermal units per pound", symbol = "BTU/lb", utype = "energy per unit mass", scale = 2326, default = "kJ/kg", link = "British thermal unit", }, ["cal/g"] = { name1 = "calorie per gram", name2 = "calories per gram", symbol = "cal/g", utype = "energy per unit mass", scale = 4184, default = "J/g", }, ["GJ/kg"] = { name1 = "gigajoule per kilogram", name2 = "gigajoules per kilogram", symbol = "GJ/kg", utype = "energy per unit mass", scale = 1e9, default = "ktTNT/t", link = "Specific energy", }, ["J/g"] = { name1 = "joule per gram", name2 = "joules per gram", symbol = "J/g", utype = "energy per unit mass", scale = 1000, default = "kcal/g", link = "Specific energy", }, ["kcal/g"] = { name1 = "kilocalorie per gram", name2 = "kilocalories per gram", symbol = "kcal/g", utype = "energy per unit mass", scale = 4184000, default = "kJ/g", }, ["kJ/g"] = { name1 = "kilojoule per gram", name2 = "kilojoules per gram", symbol = "kJ/g", utype = "energy per unit mass", scale = 1000000, default = "kcal/g", link = "Specific energy", }, ["kJ/kg"] = { name1 = "kilojoule per kilogram", name2 = "kilojoules per kilogram", symbol = "kJ/kg", utype = "energy per unit mass", scale = 1000, default = "BTU/lb", link = "Specific energy", }, ["ktonTNT/MT"] = { name2 = "kilotons of TNT per metric ton", symbol = "kiloton of TNT per metric ton", usename = 1, utype = "energy per unit mass", scale = 4184000000, default = "GJ/kg", link = "TNT equivalent", }, ["ktTNT/t"] = { name2 = "kilotonnes of TNT per tonne", symbol = "kilotonne of TNT per tonne", usename = 1, utype = "energy per unit mass", scale = 4184000000, default = "GJ/kg", link = "TNT equivalent", }, ["MtonTNT/MT"] = { name2 = "megatons of TNT per metric ton", symbol = "megaton of TNT per metric ton", usename = 1, utype = "energy per unit mass", scale = 4.184e12, default = "TJ/kg", link = "TNT equivalent", }, ["MtTNT/MT"] = { name2 = "megatonnes of TNT per tonne", symbol = "megatonne of TNT per tonne", usename = 1, utype = "energy per unit mass", scale = 4.184e12, default = "TJ/kg", link = "TNT equivalent", }, ["TJ/kg"] = { name1 = "terajoule per kilogram", name2 = "terajoules per kilogram", symbol = "TJ/kg", utype = "energy per unit mass", scale = 1e12, default = "MtTNT/MT", link = "Specific energy", }, ["Cal/g"] = { per = { "Cal", "g" }, utype = "energy per unit mass", default = "kJ/g", }, ["BTU/cuft"] = { per = { "BTU", "cuft" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/12USoz(mL)serve"] = { per = { "Cal", "-12USoz(mL)serve" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/12USoz(ml)serve"] = { per = { "Cal", "-12USoz(ml)serve" }, utype = "energy per unit volume", default = "kJ/l", }, ["Cal/12USozserve"] = { per = { "Cal", "-12USozserve" }, utype = "energy per unit volume", default = "kJ/L", }, ["Cal/USoz"] = { per = { "Cal", "USoz" }, utype = "energy per unit volume", default = "kJ/ml", }, ["kJ/L"] = { per = { "kJ", "L" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["kJ/l"] = { per = { "kJ", "ll" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["kJ/ml"] = { per = { "kJ", "ml" }, utype = "energy per unit volume", default = "Cal/USoz", }, ["MJ/m3"] = { per = { "MJ", "m3" }, utype = "energy per unit volume", default = "BTU/cuft", }, ["Sv"] = { _name1 = "sievert", _symbol = "Sv", utype = "equivalent radiation dose", scale = 1, prefixes = 1, default = "rem", link = "Sievert", }, ["rem"] = { _name1 = "rem", _symbol = "rem", utype = "equivalent radiation dose", scale = 0.01, prefixes = 1, default = "Sv", link = "Roentgen equivalent man", }, ["g/km"] = { name1 = "gram per kilometre", name1_us = "gram per kilometer", name2 = "grams per kilometre", name2_us = "grams per kilometer", symbol = "g/km", utype = "exhaust emission", scale = 1e-6, default = "oz/mi", link = "Exhaust gas", }, ["g/mi"] = { name1 = "gram per mile", name2 = "grams per mile", symbol = "g/mi", utype = "exhaust emission", scale = 6.2137119223733397e-7, default = "g/km", link = "Exhaust gas", }, ["gCO2/km"] = { name1 = "gram of CO<sub>2</sub> per kilometre", name1_us = "gram of CO<sub>2</sub> per kilometer", name2 = "grams of CO<sub>2</sub> per kilometre", name2_us = "grams of CO<sub>2</sub> per kilometer", symbol = "g(CO<sub>2</sub>)/km", utype = "exhaust emission", scale = 1e-6, default = "ozCO2/mi", link = "Exhaust gas", }, ["gCO2/mi"] = { name1 = "gram of CO<sub>2</sub> per mile", name2 = "grams of CO<sub>2</sub> per mile", symbol = "g(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 6.2137119223733397e-7, default = "gCO2/km", link = "Exhaust gas", }, ["kg/km"] = { name1 = "kilogram per kilometre", name1_us = "kilogram per kilometer", name2 = "kilograms per kilometre", name2_us = "kilograms per kilometer", symbol = "kg/km", utype = "exhaust emission", scale = 0.001, default = "lb/mi", link = "Exhaust gas", }, ["kgCO2/km"] = { name1 = "kilogram of CO<sub>2</sub> per kilometre", name1_us = "kilogram of CO<sub>2</sub> per kilometer", name2 = "kilograms of CO<sub>2</sub> per kilometre", name2_us = "kilograms of CO<sub>2</sub> per kilometer", symbol = "kg(CO<sub>2</sub>)/km", utype = "exhaust emission", scale = 0.001, default = "lbCO2/mi", link = "Exhaust gas", }, ["lb/mi"] = { name1 = "pound per mile", name2 = "pounds per mile", symbol = "lb/mi", utype = "exhaust emission", scale = 0.00028184923173665794, default = "kg/km", link = "Exhaust gas", }, ["lbCO2/mi"] = { name1 = "pound of CO<sub>2</sub> per mile", name2 = "pounds of CO<sub>2</sub> per mile", symbol = "lb(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 0.00028184923173665794, default = "kgCO2/km", link = "Exhaust gas", }, ["oz/mi"] = { name1 = "ounce per mile", name2 = "ounces per mile", symbol = "oz/mi", utype = "exhaust emission", scale = 1.7615576983541121e-5, default = "g/km", link = "Exhaust gas", }, ["ozCO2/mi"] = { name1 = "ounce of CO<sub>2</sub> per mile", name2 = "ounces of CO<sub>2</sub> per mile", symbol = "oz(CO<sub>2</sub>)/mi", utype = "exhaust emission", scale = 1.7615576983541121e-5, default = "gCO2/km", link = "Exhaust gas", }, ["cuft/a"] = { name1 = "cubic foot per annum", name2 = "cubic feet per annum", symbol = "cu&nbsp;ft/a", utype = "flow", scale = 8.9730672142368242e-10, default = "m3/a", link = "Cubic foot per second", }, ["cuft/d"] = { name1 = "cubic foot per day", name2 = "cubic feet per day", symbol = "cu&nbsp;ft/d", utype = "flow", scale = 3.2774128000000003e-7, default = "m3/d", link = "Cubic foot per second", }, ["cuft/h"] = { name1 = "cubic foot per hour", name2 = "cubic feet per hour", symbol = "cu&nbsp;ft/h", utype = "flow", scale = 7.8657907200000004e-6, default = "m3/h", link = "Cubic foot per second", }, ["cuft/min"] = { name1 = "cubic foot per minute", name2 = "cubic feet per minute", symbol = "cu&nbsp;ft/min", utype = "flow", scale = 0.00047194744319999999, default = "m3/min", }, ["cuft/s"] = { name1 = "cubic foot per second", name2 = "cubic feet per second", symbol = "cu&nbsp;ft/s", utype = "flow", scale = 28316846592e-12, default = "m3/s", }, ["cumi/a"] = { name1 = "cubic mile per annum", name2 = "cubic miles per annum", symbol = "cu&nbsp;mi/a", utype = "flow", scale = 132.08171170940057, default = "km3/a", link = "Cubic foot per second", }, ["cuyd/h"] = { name1 = "cubic yard per hour", name2 = "cubic yards per hour", symbol = "cuyd/h", utype = "flow", scale = 0.00021237634944000001, default = "m3/h", link = "Cubic foot per second", }, ["cuyd/s"] = { name1 = "cubic yard per second", name2 = "cubic yards per second", symbol = "cu&nbsp;yd/s", utype = "flow", scale = 0.76455485798400002, default = "m3/s", }, ["Goilbbl/a"] = { name1 = "billion barrels per year", name2 = "billion barrels per year", symbol = "Gbbl/a", utype = "flow", scale = 5.0380033629933836, default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3/a", link = "Barrel per day", }, ["impgal/h"] = { name1 = "imperial gallon per hour", name2 = "imperial gallons per hour", symbol = "imp&nbsp;gal/h", utype = "flow", scale = 1.2628027777777779e-6, default = "m3/h", link = "Gallon", }, ["impgal/min"] = { name1 = "imperial gallon per minute", name2 = "imperial gallons per minute", symbol = "imp gal/min", utype = "flow", scale = 7.5768166666666671e-5, default = "m3/s", link = "Gallon", }, ["impgal/s"] = { name1 = "imperial gallon per second", name2 = "imperial gallons per second", symbol = "impgal/s", utype = "flow", scale = 0.00454609, default = "m3/s", link = "Imperial gallons per second", }, ["km3/a"] = { name1 = "cubic kilometre per annum", name1_us = "cubic kilometer per annum", name2 = "cubic kilometres per annum", name2_us = "cubic kilometers per annum", symbol = "km<sup>3</sup>/a", utype = "flow", scale = 31.68808781402895, default = "cumi/a", link = "Cubic metre per second", }, ["km3/d"] = { name1 = "cubic kilometre per day", name1_us = "cubic kilometer per day", name2 = "cubic kilometres per day", name2_us = "cubic kilometers per day", symbol = "km<sup>3</sup>/d", utype = "flow", scale = 11574.074074074075, default = "cuft/d", link = "Cubic metre per second", }, ["koilbbl/a"] = { name1 = "thousand barrels per year", name2 = "thousand barrels per year", symbol = "kbbl/a", utype = "flow", scale = 5.0380033629933841e-6, default = "v * 1.58987294928 < 10 ! ! e3 ! m3/a", link = "Barrel per day", }, ["koilbbl/d"] = { name1 = "thousand barrels per day", name2 = "thousand barrels per day", symbol = "kbbl/d", utype = "flow", scale = 0.0018401307283333335, default = "v * 1.58987294928 < 10 ! ! e3 ! m3/d", link = "Barrel per day", }, ["L/h"] = { name1 = "litre per hour", name1_us = "liter per hour", name2 = "litres per hour", name2_us = "liters per hour", symbol = "L/h", utype = "flow", scale = 2.7777777777777776e-7, default = "impgal/h USgal/h", link = "Cubic metre per second", }, ["L/min"] = { name1 = "litre per minute", name1_us = "liter per minute", name2 = "litres per minute", name2_us = "liters per minute", symbol = "L/min", utype = "flow", scale = 1.6666666666666667e-5, default = "impgal/min USgal/min", link = "Cubic metre per second", }, ["L/s"] = { name1 = "litre per second", name1_us = "liter per second", name2 = "litres per second", name2_us = "liters per second", symbol = "L/s", utype = "flow", scale = 0.001, default = "cuft/s", link = "Cubic metre per second", }, ["m3/a"] = { name1 = "cubic metre per annum", name1_us = "cubic meter per annum", name2 = "cubic metres per annum", name2_us = "cubic meters per annum", symbol = "m<sup>3</sup>/a", utype = "flow", scale = 3.1688087814028947e-8, default = "cuft/a", link = "Cubic metre per second", }, ["m3/d"] = { name1 = "cubic metre per day", name1_us = "cubic meter per day", name2 = "cubic metres per day", name2_us = "cubic meters per day", symbol = "m<sup>3</sup>/d", utype = "flow", scale = 1.1574074074074073e-5, default = "cuft/d", link = "Cubic metre per second", }, ["m3/h"] = { name1 = "cubic metre per hour", name1_us = "cubic meter per hour", name2 = "cubic metres per hour", name2_us = "cubic meters per hour", symbol = "m<sup>3</sup>/h", utype = "flow", scale = 0.00027777777777777778, default = "cuft/h", link = "Cubic metre per second", }, ["m3/min"] = { name1 = "cubic metre per minute", name1_us = "cubic meter per minute", name2 = "cubic metres per minute", name2_us = "cubic meters per minute", symbol = "m<sup>3</sup>/min", utype = "flow", scale = 0.016666666666666666, default = "cuft/min", link = "Cubic metre per second", }, ["m3/s"] = { name1 = "cubic metre per second", name1_us = "cubic meter per second", name2 = "cubic metres per second", name2_us = "cubic meters per second", symbol = "m<sup>3</sup>/s", utype = "flow", scale = 1, default = "cuft/s", }, ["Moilbbl/a"] = { name1 = "million barrels per year", name2 = "million barrels per year", symbol = "Mbbl/a", utype = "flow", scale = 0.0050380033629933837, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/a", link = "Barrel per day", }, ["Moilbbl/d"] = { name1 = "million barrels per day", name2 = "million barrels per day", symbol = "Mbbl/d", utype = "flow", scale = 1.8401307283333335, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/d", link = "Barrel per day", }, ["oilbbl/a"] = { name1 = "barrel per year", name2 = "barrels per year", symbol = "bbl/a", utype = "flow", scale = 5.0380033629933841e-9, default = "m3/a", link = "Barrel per day", }, ["oilbbl/d"] = { name1 = "barrel per day", name2 = "barrels per day", symbol = "bbl/d", utype = "flow", scale = 1.8401307283333336e-6, default = "m3/d", }, ["Toilbbl/a"] = { name1 = "trillion barrels per year", name2 = "trillion barrels per year", symbol = "Tbbl/a", utype = "flow", scale = 5038.0033629933832, default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3/a", link = "Barrel per day", }, ["U.S.gal/d"] = { name1 = "U.S. gallon per day", name2 = "U.S. gallons per day", symbol = "U.S.&nbsp;gal/d", utype = "flow", scale = 4.3812636388888893e-8, default = "m3/s", customary= 1, }, ["U.S.gal/h"] = { name1 = "gallon per hour", name2 = "gallons per hour", symbol = "gal/h", utype = "flow", scale = 1.0515032733333334e-6, default = "m3/h", link = "Gallon", customary= 2, }, ["U.S.gal/min"] = { name1 = "U.S. gallon per minute", name2 = "U.S. gallons per minute", symbol = "U.S.&nbsp;gal/min", utype = "flow", scale = 6.3090196400000003e-5, default = "m3/s", link = "Gallon", }, ["USgal/a"] = { name1 = "US gallon per year", name2 = "US gallons per year", symbol = "US&nbsp;gal/a", utype = "flow", scale = 1.1995246102365199e-10, default = "m3/s", }, ["USgal/d"] = { name1 = "US gallon per day", name2 = "US gallons per day", symbol = "US&nbsp;gal/d", utype = "flow", scale = 4.3812636388888893e-8, default = "m3/s", }, ["USgal/h"] = { name1 = "gallon per hour", name2 = "gallons per hour", symbol = "gal/h", utype = "flow", scale = 1.0515032733333334e-6, default = "m3/h", link = "Gallon", customary= 1, }, ["USgal/min"] = { name1 = "US gallon per minute", name2 = "US gallons per minute", symbol = "US&nbsp;gal/min", utype = "flow", scale = 6.3090196400000003e-5, default = "m3/s", link = "Gallon", }, ["USgal/s"] = { name1 = "US gallon per second", name1_us = "U.S. gallon per second", name2 = "US gallons per second", name2_us = "U.S. gallons per second", symbol = "USgal/s", utype = "flow", scale = 0.003785411784, default = "m3/s", link = "US gallons per second", }, ["ft3/a"] = { target = "cuft/a", }, ["ft3/d"] = { target = "cuft/d", }, ["ft3/h"] = { target = "cuft/h", }, ["ft3/s"] = { target = "cuft/s", }, ["Gcuft/a"] = { target = "e9cuft/a", }, ["Gcuft/d"] = { target = "e9cuft/d", }, ["kcuft/a"] = { target = "e3cuft/a", }, ["kcuft/d"] = { target = "e3cuft/d", }, ["kcuft/s"] = { target = "e3cuft/s", }, ["Mcuft/a"] = { target = "e6cuft/a", }, ["Mcuft/d"] = { target = "e6cuft/d", }, ["Mcuft/s"] = { target = "e6cuft/s", }, ["m³/s"] = { target = "m3/s", }, ["Tcuft/a"] = { target = "e12cuft/a", }, ["Tcuft/d"] = { target = "e12cuft/d", }, ["u.s.gal/min"] = { target = "U.S.gal/min", }, ["usgal/min"] = { target = "USgal/min", }, ["-LTf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LTf", utype = "force", scale = 9964.01641818352, default = "kN", }, ["-STf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "STf", utype = "force", scale = 8896.443230521, default = "kN", }, ["dyn"] = { name1 = "dyne", symbol = "dyn", utype = "force", scale = 0.00001, default = "gr-f", }, ["g-f"] = { name1 = "gram-force", name2 = "grams-force", symbol = "g<sub>f</sub>", utype = "force", scale = 0.00980665, default = "mN oz-f", link = "Kilogram-force", }, ["gf"] = { name1 = "gram-force", name2 = "grams-force", symbol = "gf", utype = "force", scale = 0.00980665, default = "mN ozf", link = "Kilogram-force", }, ["gr-f"] = { name1 = "grain-force", name2 = "grains-force", symbol = "gr<sub>f</sub>", utype = "force", scale = 0.0006354602307515, default = "μN", link = "Pound (force)", }, ["grf"] = { name1 = "grain-force", name2 = "grains-force", symbol = "grf", utype = "force", scale = 0.0006354602307515, default = "μN", link = "Pound (force)", }, ["kdyn"] = { name1 = "kilodyne", symbol = "kdyn", utype = "force", scale = 0.01, default = "oz-f", link = "Dyne", }, ["kg-f"] = { name1 = "kilogram-force", name2 = "kilograms-force", symbol = "kg<sub>f</sub>", utype = "force", scale = 9.80665, default = "N lb-f", }, ["kgf"] = { name1 = "kilogram-force", name2 = "kilograms-force", symbol = "kgf", utype = "force", scale = 9.80665, default = "N lbf", }, ["kp"] = { name1 = "kilopond", symbol = "kp", utype = "force", scale = 9.80665, default = "N lb-f", link = "Kilogram-force", }, ["L/T-f"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "L/T<sub>f</sub>", utype = "force", scale = 9964.01641818352, default = "kN", }, ["L/Tf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "L/Tf", utype = "force", scale = 9964.01641818352, default = "kN", }, ["lb-f"] = { name1 = "pound-force", name2 = "pounds-force", symbol = "lb<sub>f</sub>", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["lbf"] = { name1 = "pound-force", name2 = "pounds-force", symbol = "lbf", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["lb(f)"] = { name1 = "pound", symbol = "lb", utype = "force", scale = 4.4482216152605, default = "N", link = "Pound (force)", }, ["LT-f"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LT<sub>f</sub>", utype = "force", scale = 9964.01641818352, default = "kN", }, ["LTf"] = { name1 = "long ton-force", name2 = "long tons-force", symbol = "LTf", usename = 1, utype = "force", scale = 9964.01641818352, default = "kN", }, ["Mdyn"] = { name1 = "megadyne", symbol = "Mdyn", utype = "force", scale = 10, default = "lb-f", link = "Dyne", }, ["mdyn"] = { name1 = "millidyne", symbol = "mdyn", utype = "force", scale = 0.00000001, default = "gr-f", link = "Dyne", }, ["mg-f"] = { name1 = "milligram-force", name2 = "milligrams-force", symbol = "mg<sub>f</sub>", utype = "force", scale = 0.00000980665, default = "μN gr-f", link = "Kilogram-force", }, ["mgf"] = { name1 = "milligram-force", name2 = "milligrams-force", symbol = "mgf", utype = "force", scale = 0.00000980665, default = "μN grf", link = "Kilogram-force", }, ["Mp"] = { name1 = "megapond", symbol = "Mp", utype = "force", scale = 9806.65, default = "kN LT-f ST-f", link = "Kilogram-force", }, ["mp"] = { name1 = "millipond", symbol = "mp", utype = "force", scale = 0.00000980665, default = "μN gr-f", link = "Kilogram-force", }, ["N"] = { _name1 = "newton", _symbol = "N", utype = "force", scale = 1, prefixes = 1, default = "lb-f", link = "Newton (unit)", }, ["oz-f"] = { name1 = "ounce-force", name2 = "ounces-force", symbol = "oz<sub>f</sub>", utype = "force", scale = 0.2780138203095378125, default = "mN", link = "Pound (force)", }, ["ozf"] = { name1 = "ounce-force", name2 = "ounces-force", symbol = "ozf", utype = "force", scale = 0.2780138203095378125, default = "mN", link = "Pound (force)", }, ["p"] = { name1 = "pond", symbol = "p", utype = "force", scale = 0.00980665, default = "mN oz-f", link = "Kilogram-force", }, ["pdl"] = { name1 = "poundal", symbol = "pdl", utype = "force", scale = 0.138254954376, default = "N", }, ["S/T-f"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "S/T<sub>f</sub>", utype = "force", scale = 8896.443230521, default = "kN", }, ["S/Tf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "S/Tf", utype = "force", scale = 8896.443230521, default = "kN", }, ["ST-f"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "ST<sub>f</sub>", utype = "force", scale = 8896.443230521, default = "kN", }, ["STf"] = { name1 = "short ton-force", name2 = "short tons-force", symbol = "STf", usename = 1, utype = "force", scale = 8896.443230521, default = "kN", }, ["t-f"] = { name1 = "tonne-force", name2 = "tonnes-force", symbol = "t<sub>f</sub>", utype = "force", scale = 9806.65, default = "kN LT-f ST-f", link = "Ton-force#Tonne-force", }, ["tf"] = { name1 = "tonne-force", name2 = "tonnes-force", symbol = "tf", utype = "force", scale = 9806.65, default = "kN LTf STf", link = "Ton-force#Tonne-force", }, ["dyne"] = { target = "dyn", }, ["newtons"] = { target = "N", }, ["poundal"] = { target = "pdl", }, ["tonne-force"] = { target = "tf", }, ["impgal/mi"] = { per = { "@impgal", "mi" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km USgal/mi", }, ["km/L"] = { per = { "km", "L" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "mpgimp mpgus", }, ["km/l"] = { per = { "km", "ll" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "mpgimp mpgus", }, ["L/100 km"] = { per = { "L", "100km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|L/100&nbsp;km]]", }, ["l/100 km"] = { per = { "ll", "100km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|l/100&nbsp;km]]", }, ["L/km"] = { per = { "L", "km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", }, ["l/km"] = { per = { "ll", "km" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "mpgimp mpgus", }, ["mi/impqt"] = { per = { "mi", "impqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/U.S.qt"] = { per = { "mi", "U.S.qt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/USqt"] = { per = { "mi", "USqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mi/usqt"] = { per = { "mi", "usqt" }, utype = "fuel efficiency", invert = -1, iscomplex= true, default = "km/L", }, ["mpgimp"] = { per = { "mi", "@impgal" }, symbol = "mpg<sub>&#8209;imp</sub>", utype = "fuel efficiency", invert = -1, iscomplex= true, default = "L/100 km+mpgus", symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[Imperial units|imp]]</sub>", }, ["mpgus"] = { per = { "mi", "+USgal" }, symbol = "mpg<sub>&#8209;US</sub>", utype = "fuel efficiency", invert = -1, iscomplex= true, default = "L/100 km+mpgimp", symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|US]]</sub>", }, ["U.S.gal/mi"] = { per = { "*U.S.gal", "mi" }, sp_us = true, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km impgal/mi", }, ["usgal/mi"] = { per = { "+USgal", "mi" }, utype = "fuel efficiency", invert = 1, iscomplex= true, default = "L/km impgal/mi", }, ["L/100km"] = { target = "L/100 km", }, ["l/100km"] = { target = "l/100 km", }, ["mpg"] = { shouldbe = "Use %{mpgus%} for miles per US gallon or %{mpgimp%} for miles per imperial gallon (not %{mpg%})", }, ["mpgU.S."] = { target = "mpgus", symbol = "mpg<sub>&#8209;U.S.</sub>", sp_us = true, symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|U.S.]]</sub>", }, ["mpgu.s."] = { target = "mpgus", symbol = "mpg<sub>&#8209;U.S.</sub>", sp_us = true, symlink = "[[Fuel economy in automobiles#Units of measure|mpg]]<sub>&#8209;[[United States customary units|U.S.]]</sub>", }, ["mpgUS"] = { target = "mpgus", }, ["USgal/mi"] = { target = "usgal/mi", }, ["kPa/m"] = { per = { "kPa", "-m-frac" }, utype = "fracture gradient", default = "psi/ft", }, ["psi/ft"] = { per = { "psi", "-ft-frac" }, utype = "fracture gradient", default = "kPa/m", }, ["cm/km"] = { name1 = "centimetre per kilometre", name1_us = "centimeter per kilometer", name2 = "centimetres per kilometre", name2_us = "centimeters per kilometer", symbol = "cm/km", utype = "gradient", scale = 0.00001, default = "ft/mi", link = "Grade (slope)", }, ["ft/mi"] = { name1 = "foot per mile", name2 = "feet per mile", symbol = "ft/mi", utype = "gradient", scale = 0.00018939393939393939, default = "v < 5.28 ! c ! ! m/km", link = "Grade (slope)", }, ["ft/nmi"] = { name1 = "foot per nautical mile", name2 = "feet per nautical mile", symbol = "ft/nmi", utype = "gradient", scale = 0.00016457883369330455, default = "v < 6.076 ! c ! ! m/km", link = "Grade (slope)", }, ["in/ft"] = { name1 = "inch per foot", name2 = "inches per foot", symbol = "in/ft", utype = "gradient", scale = 0.083333333333333329, default = "mm/m", link = "Grade (slope)", }, ["in/mi"] = { name1 = "inch per mile", name2 = "inches per mile", symbol = "in/mi", utype = "gradient", scale = 1.5782828282828283e-5, default = "v < 0.6336 ! m ! c ! m/km", link = "Grade (slope)", }, ["m/km"] = { name1 = "metre per kilometre", name1_us = "meter per kilometer", name2 = "metres per kilometre", name2_us = "meters per kilometer", symbol = "m/km", utype = "gradient", scale = 0.001, default = "ft/mi", link = "Grade (slope)", }, ["mm/km"] = { name1 = "millimetre per kilometre", name1_us = "millimeter per kilometer", name2 = "millimetres per kilometre", name2_us = "millimeters per kilometer", symbol = "mm/km", utype = "gradient", scale = 0.000001, default = "in/mi", link = "Grade (slope)", }, ["mm/m"] = { name1 = "millimetre per metre", name1_us = "millimeter per meter", name2 = "millimetres per metre", name2_us = "millimeters per meter", symbol = "mm/m", utype = "gradient", scale = 0.001, default = "in/ft", link = "Grade (slope)", }, ["admi"] = { name1 = "admiralty mile", symbol = "nmi&nbsp;(admiralty)", utype = "length", scale = 1853.184, default = "km mi", link = "Nautical mile", }, ["AU"] = { name1 = "astronomical unit", symbol = "AU", utype = "length", scale = 149597870700, default = "km mi", }, ["Brnmi"] = { name1 = "British nautical mile", symbol = "(Brit)&nbsp;nmi", utype = "length", scale = 1853.184, default = "km mi", link = "Nautical mile", }, ["bu"] = { name2 = "bu", symbol = "bu", usename = 1, utype = "length", scale = 0.0030303030303030303, default = "mm", link = "Japanese units of measurement#Length", }, ["ch"] = { name1 = "chain", symbol = "ch", utype = "length", scale = 20.1168, default = "ft m", subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } }, link = "Chain (unit)", }, ["chlk"] = { name1 = "[[Chain (unit)|chain]]", symbol = "[[Chain (unit)|ch]]", utype = "length", scale = 20.1168, default = "ft m", link = "", }, ["chain"] = { symbol = "chain", usename = 1, utype = "length", scale = 20.1168, default = "ft m", subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } }, link = "Chain (unit)", }, ["chainlk"] = { symbol = "[[Chain (unit)|chain]]", usename = 1, utype = "length", scale = 20.1168, default = "ft m", link = "", }, ["dpcm"] = { name2 = "dot/cm", symbol = "dot/cm", utype = "length", scale = 100, invert = -1, iscomplex= true, default = "dpi", link = "Dots per inch", }, ["dpi"] = { name2 = "DPI", symbol = "DPI", utype = "length", scale = 39.370078740157481, invert = -1, iscomplex= true, default = "pitch", link = "Dots per inch", }, ["fathom"] = { symbol = "fathom", usename = 1, utype = "length", scale = 1.8288, default = "ft m", }, ["foot"] = { name1 = "foot", name2 = "foot", symbol = "ft", utype = "length", scale = 0.3048, default = "m", subdivs = { ["in"] = { 12, default = "m" } }, link = "Foot (unit)", }, ["ft"] = { name1 = "foot", name2 = "feet", symbol = "ft", utype = "length", scale = 0.3048, exception= "integer_more_precision", default = "m", subdivs = { ["in"] = { 12, default = "m" } }, link = "Foot (unit)", }, ["furlong"] = { symbol = "furlong", usename = 1, utype = "length", scale = 201.168, default = "ft m", }, ["Gly"] = { name1 = "gigalight-year", symbol = "Gly", utype = "length", scale = 9.4607304725808e24, default = "Mpc", link = "Light-year#Definitions", }, ["Gpc"] = { name1 = "gigaparsec", symbol = "Gpc", utype = "length", scale = 3.0856775814671916e25, default = "Gly", link = "Parsec#Megaparsecs and gigaparsecs", }, ["hand"] = { name1 = "hand", symbol = "h", utype = "length", builtin = "hand", scale = 0.1016, iscomplex= true, default = "in cm", link = "Hand (unit)", }, ["in"] = { name1 = "inch", name2 = "inches", symbol = "in", utype = "length", scale = 0.0254, exception= "subunit_more_precision", default = "mm", }, ["inabbreviated"] = { name2 = "in", symbol = "in", utype = "length", scale = 0.0254, default = "mm", link = "Inch", }, ["kly"] = { name1 = "kilolight-year", symbol = "kly", utype = "length", scale = 9.4607304725808e18, default = "pc", link = "Light-year#Definitions", }, ["kpc"] = { name1 = "kiloparsec", symbol = "kpc", utype = "length", scale = 3.0856775814671916e19, default = "kly", link = "Parsec#Parsecs and kiloparsecs", }, ["LD"] = { name1 = "lunar distance", symbol = "LD", utype = "length", scale = 384403000, default = "km mi", link = "Lunar distance (astronomy)", }, ["league"] = { symbol = "league", usename = 1, utype = "length", scale = 4828.032, default = "km", link = "League (unit)", }, ["ly"] = { name1 = "light-year", symbol = "ly", utype = "length", scale = 9.4607304725808e15, default = "AU", }, ["m"] = { _name1 = "metre", _name1_us= "meter", _symbol = "m", utype = "length", scale = 1, prefixes = 1, default = "v > 0 and v < 3 ! ftin ! ft", link = "Metre", }, ["mi"] = { name1 = "mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", subdivs = { ["ch"] = { 80, default = "km" }, ["chlk"] = { 80, default = "km" }, ["chain"] = { 80, default = "km" }, ["chainlk"] = { 80, default = "km" }, ["ft"] = { 5280, default = "km" }, ["furlong"] = { 8, default = "km" }, ["yd"] = { 1760, default = "km" } }, }, ["mil"] = { symbol = "mil", usename = 1, utype = "length", scale = 0.0000254, default = "mm", link = "Thousandth of an inch", }, ["Mly"] = { name1 = "megalight-year", symbol = "Mly", utype = "length", scale = 9.4607304725808e21, default = "kpc", link = "Light-year#Definitions", }, ["Mpc"] = { name1 = "megaparsec", symbol = "Mpc", utype = "length", scale = 3.0856775814671916e22, default = "Mly", link = "Parsec#Megaparsecs and gigaparsecs", }, ["NM"] = { name1 = "nautical mile", symbol = "NM", utype = "length", scale = 1852, default = "km mi", }, ["nmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1852, default = "km mi", }, ["oldUKnmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1853.184, default = "km mi", }, ["oldUSnmi"] = { name1 = "nautical mile", symbol = "nmi", utype = "length", scale = 1853.24496, default = "km mi", }, ["pc"] = { name1 = "parsec", symbol = "pc", utype = "length", scale = 3.0856775814671916e16, default = "ly", }, ["perch"] = { name2 = "perches", symbol = "perch", usename = 1, utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["pitch"] = { name2 = "μm", symbol = "μm", utype = "length", scale = 1e-6, default = "dpi", defkey = "pitch", linkey = "pitch", link = "Dots per inch", }, ["pole"] = { symbol = "pole", usename = 1, utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["pre1954U.S.nmi"] = { name1 = "(pre-1954&nbsp;U.S.) nautical mile", symbol = "(pre&#8209;1954&nbsp;U.S.) nmi", utype = "length", scale = 1853.24496, default = "km mi", link = "Nautical mile", }, ["pre1954USnmi"] = { name1 = "(pre-1954&nbsp;US) nautical mile", name1_us = "(pre-1954&nbsp;U.S.) nautical mile", symbol = "(pre&#8209;1954&nbsp;US) nmi", sym_us = "(pre&#8209;1954&nbsp;U.S.) nmi", utype = "length", scale = 1853.24496, default = "km mi", link = "Nautical mile", }, ["rd"] = { name1 = "rod", symbol = "rd", utype = "length", scale = 5.0292, default = "ft m", link = "Rod (unit)", }, ["royal cubit"] = { name1 = "royal cubit", symbol = "cu", utype = "length", scale = 0.524, default = "mm", }, ["rtkm"] = { name1 = "route kilometre", name1_us = "route kilometer", symbol = "km", utype = "length", scale = 1000, default = "mi", link = "Kilometre", }, ["rtmi"] = { name1 = "route mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", link = "Mile", }, ["shaku"] = { name2 = "shaku", symbol = "shaku", usename = 1, utype = "length", scale = 0.30303030303030304, default = "m", link = "Shaku (unit)", }, ["sm"] = { name1 = "smoot", symbol = "sm", utype = "length", scale = 1.70180, default = "m", link = "Smoot (unit)", }, ["smi"] = { name1 = "statute mile", symbol = "mi", utype = "length", scale = 1609.344, default = "km", subdivs = { ["chain"] = { 80, default = "km" } }, }, ["solar radius"] = { name1 = "solar radius", name2 = "solar radii", symbol = "''R''<sub>☉</sub>", utype = "length", scale = 695700e3, default = "km", }, ["sun"] = { name2 = "sun", symbol = "sun", usename = 1, utype = "length", scale = 0.030303030303030304, default = "mm", link = "Japanese units of measurement#Length", }, ["thou"] = { name2 = "thou", symbol = "thou", usename = 1, utype = "length", scale = 0.0000254, default = "mm", link = "Thousandth of an inch", }, ["verst"] = { symbol = "verst", usename = 1, utype = "length", scale = 1066.8, default = "km mi", }, ["yd"] = { name1 = "yard", symbol = "yd", utype = "length", scale = 0.9144, default = "m", subdivs = { ["ft"] = { 3, default = "m" } }, }, ["μin"] = { name1 = "microinch", name2 = "microinches", symbol = "μin", utype = "length", scale = 0.0000000254, default = "nm", link = "SI prefix#Non-metric units", }, ["Å"] = { name1 = "ångström", symbol = "Å", utype = "length", scale = 0.0000000001, default = "in", }, ["Hz"] = { _name1 = "hertz", _name2 = "hertz", _symbol = "Hz", utype = "length", scale = 3.3356409519815204e-9, invert = -1, iscomplex= true, prefixes = 1, default = "m", link = "Hertz", }, ["rpm"] = { name1 = "revolution per minute", name2 = "revolutions per minute", symbol = "rpm", utype = "length", scale = 5.5594015866358675e-11, invert = -1, iscomplex= true, default = "Hz", link = "Revolutions per minute", }, ["-ft-frac"] = { target = "ft", link = "Fracture gradient", }, ["-in-stiff"] = { target = "in", link = "Stiffness", }, ["-m-frac"] = { target = "m", link = "Fracture gradient", }, ["-m-stiff"] = { target = "m", link = "Stiffness", }, ["100km"] = { target = "km", multiplier= 100, }, ["100mi"] = { target = "mi", multiplier= 100, }, ["100miles"] = { target = "mi", symbol = "miles", multiplier= 100, }, ["admiralty nmi"] = { target = "oldUKnmi", }, ["angstrom"] = { target = "Å", }, ["au"] = { target = "AU", symbol = "au", }, ["feet"] = { target = "ft", }, ["hands"] = { target = "hand", }, ["inch"] = { target = "in", }, ["inches"] = { target = "in", }, ["light-year"] = { target = "ly", }, ["meter"] = { target = "m", sp_us = true, }, ["meters"] = { target = "m", sp_us = true, }, ["metre"] = { target = "m", }, ["metres"] = { target = "m", }, ["micrometre"] = { target = "μm", }, ["micron"] = { target = "μm", default = "μin", }, ["mile"] = { target = "mi", usename = 1, }, ["miles"] = { target = "mi", usename = 1, }, ["parsec"] = { target = "pc", }, ["rod"] = { target = "rd", }, ["smoot"] = { target = "sm", }, ["uin"] = { target = "μin", }, ["yard"] = { target = "yd", }, ["yards"] = { target = "yd", }, ["yds"] = { target = "yd", }, ["dtex"] = { name1 = "decitex", name2 = "decitex", symbol = "dtex", utype = "linear density", scale = 1e-7, default = "lb/yd", link = "Units of textile measurement#Units", }, ["kg/cm"] = { name1 = "kilogram per centimetre", name1_us = "kilogram per centimeter", name2 = "kilograms per centimetre", name2_us = "kilograms per centimeter", symbol = "kg/cm", utype = "linear density", scale = 100, default = "lb/yd", link = "Linear density", }, ["kg/m"] = { name1 = "kilogram per metre", name1_us = "kilogram per meter", name2 = "kilograms per metre", name2_us = "kilograms per meter", symbol = "kg/m", utype = "linear density", scale = 1, default = "lb/yd", link = "Linear density", }, ["lb/ft"] = { name1 = "pound per foot", name2 = "pounds per foot", symbol = "lb/ft", utype = "linear density", scale = 1.4881639435695539, default = "kg/m", link = "Linear density", }, ["lb/yd"] = { name1 = "pound per yard", name2 = "pounds per yard", symbol = "lb/yd", utype = "linear density", scale = 0.49605464785651798, default = "kg/m", link = "Linear density", }, ["G"] = { _name1 = "gauss", _name2 = "gauss", _symbol = "G", utype = "magnetic field strength", scale = 0.0001, prefixes = 1, default = "T", link = "Gauss (unit)", }, ["T"] = { _name1 = "tesla", _symbol = "T", utype = "magnetic field strength", scale = 1, prefixes = 1, default = "G", link = "Tesla (unit)", }, ["A/m"] = { name1 = "ampere per metre", name1_us = "ampere per meter", name2 = "amperes per metre", name2_us = "amperes per meter", symbol = "A/m", utype = "magnetizing field", scale = 1, default = "Oe", }, ["kA/m"] = { name1 = "kiloampere per metre", name1_us = "kiloampere per meter", name2 = "kiloamperes per metre", name2_us = "kiloamperes per meter", symbol = "kA/m", utype = "magnetizing field", scale = 1000, default = "kOe", link = "Ampere per metre", }, ["MA/m"] = { name1 = "megaampere per metre", name1_us = "megaampere per meter", name2 = "megaamperes per metre", name2_us = "megaamperes per meter", symbol = "MA/m", utype = "magnetizing field", scale = 1e6, default = "kOe", link = "Ampere per metre", }, ["Oe"] = { _name1 = "oersted", _symbol = "Oe", utype = "magnetizing field", scale = 79.5774715, prefixes = 1, default = "kA/m", link = "Oersted", }, ["-Lcwt"] = { name1 = "hundredweight", name2 = "hundredweight", symbol = "cwt", utype = "mass", scale = 50.80234544, default = "lb", }, ["-Scwt"] = { name1 = "hundredweight", name2 = "hundredweight", symbol = "cwt", utype = "mass", scale = 45.359237, default = "lb", }, ["-ST"] = { name1 = "short ton", symbol = "ST", utype = "mass", scale = 907.18474, default = "t", }, ["carat"] = { symbol = "carat", usename = 1, utype = "mass", scale = 0.0002, default = "g", link = "Carat (mass)", }, ["drachm"] = { name1_us = "dram", symbol = "drachm", usename = 1, utype = "mass", scale = 0.001771845195, default = "g", link = "Dram (unit)", }, ["dram"] = { target = "drachm", }, ["dwt"] = { name1 = "pennyweight", symbol = "dwt", utype = "mass", scale = 0.00155517384, default = "oz g", }, ["DWton"] = { symbol = "deadweight ton", usename = 1, utype = "mass", scale = 1016.0469088, default = "DWtonne", link = "Deadweight tonnage", }, ["DWtonne"] = { name1_us = "deadweight metric ton", symbol = "deadweight tonne", sym_us = "~deadweight metric ton", usename = 1, utype = "mass", scale = 1000, default = "DWton", link = "Deadweight tonnage", }, ["g"] = { _name1 = "gram", _symbol = "g", utype = "mass", scale = 0.001, prefixes = 1, default = "oz", link = "Gram", }, ["gr"] = { name1 = "grain", symbol = "gr", utype = "mass", scale = 0.00006479891, default = "g", link = "Grain (unit)", }, ["Gt"] = { name1 = "gigatonne", symbol = "Gt", utype = "mass", scale = 1000000000000, default = "LT ST", link = "Tonne", }, ["impgalh2o"] = { name1 = "imperial gallon of water", name2 = "imperial gallons of water", symbol = "imp&nbsp;gal H<sub>2</sub>O", utype = "mass", scale = 4.5359236999999499, default = "lb kg", link = "Imperial gallon", }, ["kt"] = { name1 = "kilotonne", symbol = "kt", utype = "mass", scale = 1000000, default = "LT ST", link = "Tonne", }, ["lb"] = { name1 = "pound", symbol = "lb", utype = "mass", scale = 0.45359237, exception= "integer_more_precision", default = "kg", subdivs = { ["oz"] = { 16, default = "kg" } }, link = "Pound (mass)", }, ["Lcwt"] = { name1 = "long hundredweight", name2 = "long hundredweight", symbol = "Lcwt", usename = 1, utype = "mass", scale = 50.80234544, default = "lb", subdivs = { ["qtr"] = { 4, default = "kg" }, ["st"] = { 8, default = "kg" } }, link = "Hundredweight", }, ["long cwt"] = { name1 = "long hundredweight", name2 = "long hundredweight", symbol = "long&nbsp;cwt", utype = "mass", scale = 50.80234544, default = "lb kg", subdivs = { ["qtr"] = { 4, default = "kg" } }, link = "Hundredweight", }, ["long qtr"] = { name1 = "long quarter", symbol = "long&nbsp;qtr", utype = "mass", scale = 12.70058636, default = "lb kg", }, ["LT"] = { symbol = "long ton", usename = 1, utype = "mass", scale = 1016.0469088, default = "t", subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } }, }, ["lt"] = { name1 = "long ton", symbol = "LT", utype = "mass", scale = 1016.0469088, default = "t", subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } }, }, ["metric ton"] = { symbol = "metric ton", usename = 1, utype = "mass", scale = 1000, default = "long ton", link = "Tonne", }, ["MT"] = { name1 = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "LT ST", link = "Tonne", }, ["Mt"] = { name1 = "megatonne", symbol = "Mt", utype = "mass", scale = 1000000000, default = "LT ST", link = "Tonne", }, ["oz"] = { name1 = "ounce", symbol = "oz", utype = "mass", scale = 0.028349523125, default = "g", }, ["ozt"] = { name1 = "troy ounce", symbol = "ozt", utype = "mass", scale = 0.0311034768, default = "oz g", }, ["pdr"] = { name1 = "pounder", symbol = "pdr", utype = "mass", scale = 0.45359237, default = "kg", link = "Pound (mass)", }, ["qtr"] = { name1 = "quarter", symbol = "qtr", utype = "mass", scale = 12.70058636, default = "lb kg", subdivs = { ["lb"] = { 28, default = "kg" } }, link = "Long quarter", }, ["Scwt"] = { name1 = "short hundredweight", name2 = "short hundredweight", symbol = "Scwt", usename = 1, utype = "mass", scale = 45.359237, default = "lb", link = "Hundredweight", }, ["short cwt"] = { name1 = "short hundredweight", name2 = "short hundredweight", symbol = "short&nbsp;cwt", utype = "mass", scale = 45.359237, default = "lb kg", link = "Hundredweight", }, ["short qtr"] = { name1 = "short quarter", symbol = "short&nbsp;qtr", utype = "mass", scale = 11.33980925, default = "lb kg", }, ["ST"] = { symbol = "short ton", usename = 1, utype = "mass", scale = 907.18474, default = "t", subdivs = { ["Scwt"] = { 20, default = "t", unit = "-Scwt" } }, }, ["shtn"] = { name1 = "short ton", symbol = "sh&nbsp;tn", utype = "mass", scale = 907.18474, default = "t", }, ["shton"] = { symbol = "ton", usename = 1, utype = "mass", scale = 907.18474, default = "t", }, ["solar mass"] = { name1 = "solar mass", name2 = "solar masses", symbol = "''M''<sub>☉</sub>", utype = "mass", scale = 1.98855e30, default = "kg", }, ["st"] = { name1 = "stone", name2 = "stone", symbol = "st", utype = "mass", scale = 6.35029318, default = "lb kg", subdivs = { ["lb"] = { 14, default = "kg lb" } }, link = "Stone (unit)", }, ["t"] = { name1 = "tonne", name1_us = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "LT ST", }, ["tonne"] = { name1 = "tonne", name1_us = "metric ton", symbol = "t", utype = "mass", scale = 1000, default = "shton", }, ["troy pound"] = { symbol = "troy pound", usename = 1, utype = "mass", scale = 0.3732417216, default = "lb kg", link = "Troy weight", }, ["usgalh2o"] = { name1 = "US gallon of water", name1_us = "U.S. gallon of water", name2 = "US gallons of water", name2_us = "U.S. gallons of water", symbol = "US&nbsp;gal H<sub>2</sub>O", utype = "mass", scale = 3.7776215836051126, default = "lb kg", link = "United States customary units#Fluid volume", }, ["viss"] = { name2 = "viss", symbol = "viss", utype = "mass", scale = 1.632932532, default = "kg", link = "Myanmar units of measurement#Mass", }, ["billion tonne"] = { target = "e9t", }, ["kilogram"] = { target = "kg", }, ["kilotonne"] = { target = "kt", }, ["lbs"] = { target = "lb", }, ["lbt"] = { target = "troy pound", }, ["lcwt"] = { target = "Lcwt", }, ["long ton"] = { target = "LT", }, ["mcg"] = { target = "μg", }, ["million tonne"] = { target = "e6t", }, ["scwt"] = { target = "Scwt", }, ["short ton"] = { target = "ST", }, ["stone"] = { target = "st", }, ["thousand tonne"] = { target = "e3t", }, ["tonnes"] = { target = "t", }, ["kg/kW"] = { name1 = "kilogram per kilowatt", name2 = "kilograms per kilowatt", symbol = "kg/kW", utype = "mass per unit power", scale = 0.001, default = "lb/hp", link = "Kilowatt", }, ["lb/hp"] = { name1 = "pound per horsepower", name2 = "pounds per horsepower", symbol = "lb/hp", utype = "mass per unit power", scale = 0.00060827738784176115, default = "kg/kW", link = "Horsepower", }, ["kg/h"] = { per = { "kg", "h" }, utype = "mass per unit time", default = "lb/h", }, ["lb/h"] = { per = { "lb", "h" }, utype = "mass per unit time", default = "kg/h", }, ["g-mol/d"] = { name1 = "gram-mole per day", name2 = "gram-moles per day", symbol = "g&#8209;mol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["g-mol/h"] = { name1 = "gram-mole per hour", name2 = "gram-moles per hour", symbol = "g&#8209;mol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["g-mol/min"] = { name1 = "gram-mole per minute", name2 = "gram-moles per minute", symbol = "g&#8209;mol/min", utype = "molar rate", scale = 0.016666666666666666, default = "g-mol/s", link = "Mole (unit)", }, ["g-mol/s"] = { name1 = "gram-mole per second", name2 = "gram-moles per second", symbol = "g&#8209;mol/s", utype = "molar rate", scale = 1, default = "lb-mol/min", link = "Mole (unit)", }, ["gmol/d"] = { name1 = "gram-mole per day", name2 = "gram-moles per day", symbol = "gmol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["gmol/h"] = { name1 = "gram-mole per hour", name2 = "gram-moles per hour", symbol = "gmol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["gmol/min"] = { name1 = "gram-mole per minute", name2 = "gram-moles per minute", symbol = "gmol/min", utype = "molar rate", scale = 0.016666666666666666, default = "gmol/s", link = "Mole (unit)", }, ["gmol/s"] = { name1 = "gram-mole per second", name2 = "gram-moles per second", symbol = "gmol/s", utype = "molar rate", scale = 1, default = "lbmol/min", link = "Mole (unit)", }, ["kmol/d"] = { name1 = "kilomole per day", name2 = "kilomoles per day", symbol = "kmol/d", utype = "molar rate", scale = 0.011574074074074073, default = "mmol/s", link = "Mole (unit)", }, ["kmol/h"] = { name1 = "kilomole per hour", name2 = "kilomoles per hour", symbol = "kmol/h", utype = "molar rate", scale = 0.27777777777777779, default = "mol/s", link = "Mole (unit)", }, ["kmol/min"] = { name1 = "kilomole per minute", name2 = "kilomoles per minute", symbol = "kmol/min", utype = "molar rate", scale = 16.666666666666668, default = "mol/s", link = "Kilomole (unit)", }, ["kmol/s"] = { name1 = "kilomole per second", name2 = "kilomoles per second", symbol = "kmol/s", utype = "molar rate", scale = 1000, default = "lb-mol/s", link = "Mole (unit)", }, ["lb-mol/d"] = { name1 = "pound-mole per day", name2 = "pound-moles per day", symbol = "lb&#8209;mol/d", utype = "molar rate", scale = 0.0052499116898148141, default = "mmol/s", link = "Pound-mole", }, ["lb-mol/h"] = { name1 = "pound-mole per hour", name2 = "pound-moles per hour", symbol = "lb&#8209;mol/h", utype = "molar rate", scale = 0.12599788055555555, default = "mol/s", link = "Pound-mole", }, ["lb-mol/min"] = { name1 = "pound-mole per minute", name2 = "pound-moles per minute", symbol = "lb&#8209;mol/min", utype = "molar rate", scale = 7.5598728333333334, default = "mol/s", link = "Pound-mole", }, ["lb-mol/s"] = { name1 = "pound-mole per second", name2 = "pound-moles per second", symbol = "lb&#8209;mol/s", utype = "molar rate", scale = 453.59237, default = "kmol/s", link = "Pound-mole", }, ["lbmol/d"] = { name1 = "pound-mole per day", name2 = "pound-moles per day", symbol = "lbmol/d", utype = "molar rate", scale = 0.0052499116898148141, default = "mmol/s", link = "Pound-mole", }, ["lbmol/h"] = { name1 = "pound-mole per hour", name2 = "pound-moles per hour", symbol = "lbmol/h", utype = "molar rate", scale = 0.12599788055555555, default = "mol/s", link = "Pound-mole", }, ["lbmol/min"] = { name1 = "pound-mole per minute", name2 = "pound-moles per minute", symbol = "lbmol/min", utype = "molar rate", scale = 7.5598728333333334, default = "mol/s", link = "Pound-mole", }, ["lbmol/s"] = { name1 = "pound-mole per second", name2 = "pound-moles per second", symbol = "lbmol/s", utype = "molar rate", scale = 453.59237, default = "kmol/s", link = "Pound-mole", }, ["mmol/s"] = { name1 = "millimole per second", name2 = "millimoles per second", symbol = "mmol/s", utype = "molar rate", scale = 0.001, default = "lb-mol/d", link = "Mole (unit)", }, ["mol/d"] = { name1 = "mole per day", name2 = "moles per day", symbol = "mol/d", utype = "molar rate", scale = 1.1574074074074073e-5, default = "μmol/s", link = "Mole (unit)", }, ["mol/h"] = { name1 = "mole per hour", name2 = "moles per hour", symbol = "mol/h", utype = "molar rate", scale = 0.00027777777777777778, default = "mmol/s", link = "Mole (unit)", }, ["mol/min"] = { name1 = "mole per minute", name2 = "moles per minute", symbol = "mol/min", utype = "molar rate", scale = 0.016666666666666666, default = "mol/s", link = "Mole (unit)", }, ["mol/s"] = { name1 = "mole per second", name2 = "moles per second", symbol = "mol/s", utype = "molar rate", scale = 1, default = "lb-mol/min", link = "Mole (unit)", }, ["μmol/s"] = { name1 = "micromole per second", name2 = "micromoles per second", symbol = "μmol/s", utype = "molar rate", scale = 0.000001, default = "lb-mol/d", link = "Mole (unit)", }, ["umol/s"] = { target = "μmol/s", }, ["/acre"] = { name1 = "per acre", name2 = "per acre", symbol = "/acre", utype = "per unit area", scale = 0.00024710538146716532, default = "/ha", link = "Acre", }, ["/ha"] = { name1 = "per hectare", name2 = "per hectare", symbol = "/ha", utype = "per unit area", scale = 100e-6, default = "/acre", link = "Hectare", }, ["/sqcm"] = { name1 = "per square centimetre", name1_us = "per square centimeter", name2 = "per square centimetre", name2_us = "per square centimeter", symbol = "/cm<sup>2</sup>", utype = "per unit area", scale = 1e4, default = "/sqin", link = "Square centimetre", }, ["/sqin"] = { name1 = "per square inch", name2 = "per square inch", symbol = "/in<sup>2</sup>", utype = "per unit area", scale = 1550.0031000062002, default = "/sqcm", link = "Square inch", }, ["/sqkm"] = { name1 = "per square kilometre", name1_us = "per square kilometer", name2 = "per square kilometre", name2_us = "per square kilometer", symbol = "/km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "/sqmi", link = "Square kilometre", }, ["/sqmi"] = { name1 = "per square mile", name2 = "per square mile", symbol = "/sq&nbsp;mi", utype = "per unit area", scale = 3.8610215854244582e-7, default = "/sqkm", link = "Square mile", }, ["PD/acre"] = { name1 = "inhabitant per acre", name2 = "inhabitants per acre", symbol = "/acre", utype = "per unit area", scale = 0.00024710538146716532, default = "PD/ha", link = "Acre", }, ["PD/ha"] = { name1 = "inhabitant per hectare", name2 = "inhabitants per hectare", symbol = "/ha", utype = "per unit area", scale = 100e-6, default = "PD/acre", link = "Hectare", }, ["PD/sqkm"] = { name1 = "inhabitant per square kilometre", name1_us = "inhabitant per square kilometer", name2 = "inhabitants per square kilometre", name2_us = "inhabitants per square kilometer", symbol = "/km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "PD/sqmi", link = "Square kilometre", }, ["PD/sqmi"] = { name1 = "inhabitant per square mile", name2 = "inhabitants per square mile", symbol = "/sq&nbsp;mi", utype = "per unit area", scale = 3.8610215854244582e-7, default = "PD/sqkm", link = "Square mile", }, ["/cm2"] = { target = "/sqcm", }, ["/in2"] = { target = "/sqin", }, ["/km2"] = { target = "/sqkm", }, ["pd/acre"] = { target = "PD/acre", }, ["pd/ha"] = { target = "PD/ha", }, ["PD/km2"] = { target = "PD/sqkm", }, ["pd/km2"] = { target = "PD/sqkm", }, ["PD/km²"] = { target = "PD/sqkm", }, ["pd/sqkm"] = { target = "PD/sqkm", }, ["pd/sqmi"] = { target = "PD/sqmi", }, ["/l"] = { name1 = "per litre", name1_us = "per liter", name2 = "per litre", name2_us = "per liter", symbol = "/l", utype = "per unit volume", scale = 1000, default = "/usgal", link = "Litre", }, ["/L"] = { name1 = "per litre", name1_us = "per liter", name2 = "per litre", name2_us = "per liter", symbol = "/L", utype = "per unit volume", scale = 1000, default = "/usgal", link = "Litre", }, ["/USgal"] = { name1 = "per gallon", name2 = "per gallon", symbol = "/gal", utype = "per unit volume", scale = 264.172052, default = "/L", link = "US gallon", customary= 2, }, ["/usgal"] = { target = "/USgal", }, ["bhp"] = { name1 = "brake horsepower", name2 = "brake horsepower", symbol = "bhp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Brake horsepower", }, ["Cal/d"] = { name1 = "large calorie per day", name2 = "large calories per day", symbol = "Cal/d", utype = "power", scale = 0.048425925925925928, default = "kJ/d", link = "Calorie", }, ["Cal/h"] = { name1 = "large calorie per hour", name2 = "large calories per hour", symbol = "Cal/h", utype = "power", scale = 1.1622222222222223, default = "kJ/h", link = "Calorie", }, ["cal/h"] = { name1 = "calorie per hour", name2 = "calories per hour", symbol = "cal/h", utype = "power", scale = 0.0011622222222222223, default = "W", link = "Calorie", }, ["CV"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "CV", utype = "power", scale = 735.49875, default = "kW", }, ["hk"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "hk", utype = "power", scale = 735.49875, default = "kW", }, ["hp"] = { name1 = "horsepower", name2 = "horsepower", symbol = "hp", utype = "power", scale = 745.69987158227022, default = "kW", }, ["hp-electric"] = { name1 = "electric horsepower", name2 = "electric horsepower", symbol = "hp", utype = "power", scale = 746, default = "kW", link = "Horsepower#Electrical horsepower", }, ["hp-electrical"] = { name1 = "electrical horsepower", name2 = "electrical horsepower", symbol = "hp", utype = "power", scale = 746, default = "kW", link = "Horsepower#Electrical horsepower", }, ["hp-metric"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "hp", utype = "power", scale = 735.49875, default = "kW", }, ["ihp"] = { name1 = "indicated horsepower", name2 = "indicated horsepower", symbol = "ihp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Indicated horsepower", }, ["kcal/h"] = { name1 = "kilocalorie per hour", name2 = "kilocalories per hour", symbol = "kcal/h", utype = "power", scale = 1.1622222222222223, default = "kW", link = "Calorie", }, ["kJ/d"] = { name1 = "kilojoule per day", name2 = "kilojoules per day", symbol = "kJ/d", utype = "power", scale = 0.011574074074074073, default = "Cal/d", link = "Kilojoule", }, ["kJ/h"] = { name1 = "kilojoule per hour", name2 = "kilojoules per hour", symbol = "kJ/h", utype = "power", scale = 0.27777777777777779, default = "W", link = "Kilojoule", }, ["PS"] = { name1 = "metric horsepower", name2 = "metric horsepower", symbol = "PS", utype = "power", scale = 735.49875, default = "kW", }, ["shp"] = { name1 = "shaft horsepower", name2 = "shaft horsepower", symbol = "shp", utype = "power", scale = 745.69987158227022, default = "kW", link = "Horsepower#Shaft horsepower", }, ["W"] = { _name1 = "watt", _symbol = "W", utype = "power", scale = 1, prefixes = 1, default = "hp", link = "Watt", }, ["BTU/h"] = { per = { "BTU", "h" }, utype = "power", default = "W", }, ["Btu/h"] = { per = { "Btu", "h" }, utype = "power", default = "W", }, ["BHP"] = { target = "bhp", }, ["btu/h"] = { target = "BTU/h", }, ["HP"] = { target = "hp", }, ["Hp"] = { target = "hp", }, ["hp-mechanical"] = { target = "hp", }, ["IHP"] = { target = "ihp", }, ["SHP"] = { target = "shp", }, ["whp"] = { target = "hp", }, ["hp/lb"] = { name1 = "horsepower per pound", name2 = "horsepower per pound", symbol = "hp/lb", utype = "power per unit mass", scale = 1643.986806, default = "kW/kg", link = "Power-to-weight ratio", }, ["hp/LT"] = { name1 = "horsepower per long ton", name2 = "horsepower per long ton", symbol = "hp/LT", utype = "power per unit mass", scale = 0.73392268125000004, default = "kW/t", link = "Power-to-weight ratio", }, ["hp/ST"] = { name1 = "horsepower per short ton", name2 = "horsepower per short ton", symbol = "hp/ST", utype = "power per unit mass", scale = 0.821993403, default = "kW/t", link = "Power-to-weight ratio", }, ["hp/t"] = { name1 = "horsepower per tonne", name2 = "horsepower per tonne", symbol = "hp/t", utype = "power per unit mass", scale = 0.74569987158227022, default = "kW/t", link = "Power-to-weight ratio", }, ["kW/kg"] = { name1 = "kilowatt per kilogram", name2 = "kilowatts per kilogram", symbol = "kW/kg", utype = "power per unit mass", scale = 1000, default = "hp/lb", link = "Power-to-weight ratio", }, ["kW/t"] = { name1 = "kilowatt per tonne", name2 = "kilowatts per tonne", symbol = "kW/t", utype = "power per unit mass", scale = 1, default = "PS/t", link = "Power-to-weight ratio", }, ["PS/t"] = { name1 = "metric horsepower per tonne", name2 = "metric horsepower per tonne", symbol = "PS/t", utype = "power per unit mass", scale = 0.73549875, default = "kW/t", link = "Power-to-weight ratio", }, ["shp/lb"] = { name1 = "shaft horsepower per pound", name2 = "shaft horsepower per pound", symbol = "shp/lb", utype = "power per unit mass", scale = 1643.986806, default = "kW/kg", link = "Power-to-weight ratio", }, ["hp/tonne"] = { target = "hp/t", symbol = "hp/tonne", default = "kW/tonne", }, ["kW/tonne"] = { target = "kW/t", symbol = "kW/tonne", }, ["-lb/in2"] = { name1 = "pound per square inch", name2 = "pounds per square inch", symbol = "lb/in<sup>2</sup>", utype = "pressure", scale = 6894.7572931683608, default = "kPa kgf/cm2", }, ["atm"] = { name1 = "standard atmosphere", symbol = "atm", utype = "pressure", scale = 101325, default = "kPa", link = "Atmosphere (unit)", }, ["Ba"] = { name1 = "barye", symbol = "Ba", utype = "pressure", scale = 0.1, default = "Pa", }, ["bar"] = { symbol = "bar", utype = "pressure", scale = 100000, default = "kPa", link = "Bar (unit)", }, ["dbar"] = { name1 = "decibar", symbol = "dbar", utype = "pressure", scale = 10000, default = "kPa", link = "Bar (unit)", }, ["inHg"] = { name1 = "inch of mercury", name2 = "inches of mercury", symbol = "inHg", utype = "pressure", scale = 3386.388640341, default = "kPa", }, ["kBa"] = { name1 = "kilobarye", symbol = "kBa", utype = "pressure", scale = 100, default = "hPa", link = "Barye", }, ["kg-f/cm2"] = { name1 = "kilogram-force per square centimetre", name1_us = "kilogram-force per square centimeter", name2 = "kilograms-force per square centimetre", name2_us = "kilograms-force per square centimeter", symbol = "kg<sub>f</sub>/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["kg/cm2"] = { name1 = "kilogram per square centimetre", name1_us = "kilogram per square centimeter", name2 = "kilograms per square centimetre", name2_us = "kilograms per square centimeter", symbol = "kg/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["kgf/cm2"] = { name1 = "kilogram-force per square centimetre", name1_us = "kilogram-force per square centimeter", name2 = "kilograms-force per square centimetre", name2_us = "kilograms-force per square centimeter", symbol = "kgf/cm<sup>2</sup>", utype = "pressure", scale = 98066.5, default = "psi", link = "Kilogram-force", }, ["ksi"] = { name1 = "kilopound per square inch", name2 = "kilopounds per square inch", symbol = "ksi", utype = "pressure", scale = 6894757.2931683613, default = "MPa", link = "Pound per square inch", }, ["lbf/in2"] = { name1 = "pound-force per square inch", name2 = "pounds-force per square inch", symbol = "lbf/in<sup>2</sup>", utype = "pressure", scale = 6894.7572931683608, default = "kPa kgf/cm2", }, ["mb"] = { name1 = "millibar", symbol = "mb", utype = "pressure", scale = 100, default = "hPa", link = "Bar (unit)", }, ["mbar"] = { name1 = "millibar", symbol = "mbar", utype = "pressure", scale = 100, default = "hPa", link = "Bar (unit)", }, ["mmHg"] = { name1 = "millimetre of mercury", name1_us = "millimeter of mercury", name2 = "millimetres of mercury", name2_us = "millimeters of mercury", symbol = "mmHg", utype = "pressure", scale = 133.322387415, default = "kPa", }, ["Pa"] = { _name1 = "pascal", _symbol = "Pa", utype = "pressure", scale = 1, prefixes = 1, default = "psi", link = "Pascal (unit)", }, ["psf"] = { name1 = "pound per square foot", name2 = "pounds per square foot", symbol = "psf", utype = "pressure", scale = 47.880258980335839, default = "kPa", link = "Pound per square inch", }, ["psi"] = { name1 = "pound per square inch", name2 = "pounds per square inch", symbol = "psi", utype = "pressure", scale = 6894.7572931683608, default = "kPa", }, ["Torr"] = { name1 = "torr", symbol = "Torr", utype = "pressure", scale = 133.32236842105263, default = "kPa", }, ["N/cm2"] = { per = { "N", "cm2" }, utype = "pressure", default = "psi", }, ["N/m2"] = { per = { "N", "m2" }, utype = "pressure", default = "psi", }, ["g/cm2"] = { per = { "g", "cm2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["g/m2"] = { per = { "g", "m2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["kg/ha"] = { per = { "kg", "ha" }, utype = "pressure", default = "lb/acre", multiplier= 9.80665, }, ["kg/m2"] = { per = { "kg", "m2" }, utype = "pressure", default = "lb/sqft", multiplier= 9.80665, }, ["lb/1000sqft"] = { per = { "lb", "1000sqft" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["lb/acre"] = { per = { "lb", "acre" }, utype = "pressure", default = "kg/ha", multiplier= 9.80665, }, ["lb/sqft"] = { per = { "lb", "sqft" }, utype = "pressure", default = "kg/m2", multiplier= 9.80665, }, ["lb/sqyd"] = { per = { "lb", "sqyd" }, utype = "pressure", default = "kg/m2", multiplier= 9.80665, }, ["LT/acre"] = { per = { "LT", "acre" }, utype = "pressure", default = "t/ha", multiplier= 9.80665, }, ["MT/ha"] = { per = { "MT", "ha" }, utype = "pressure", default = "LT/acre ST/acre", multiplier= 9.80665, }, ["oz/sqft"] = { per = { "oz", "sqft" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["oz/sqyd"] = { per = { "oz", "sqyd" }, utype = "pressure", default = "g/m2", multiplier= 9.80665, }, ["ST/acre"] = { per = { "ST", "acre" }, utype = "pressure", default = "t/ha", multiplier= 9.80665, }, ["t/ha"] = { per = { "t", "ha" }, utype = "pressure", default = "LT/acre ST/acre", multiplier= 9.80665, }, ["tonne/acre"] = { per = { "tonne", "acre" }, utype = "pressure", default = "tonne/ha", multiplier= 9.80665, }, ["tonne/ha"] = { per = { "tonne", "ha" }, utype = "pressure", default = "tonne/acre", multiplier= 9.80665, }, ["kgfpsqcm"] = { target = "kgf/cm2", }, ["kgpsqcm"] = { target = "kg/cm2", }, ["kN/m2"] = { target = "kPa", }, ["lb/in2"] = { target = "lbf/in2", }, ["torr"] = { target = "Torr", }, ["Bq"] = { _name1 = "becquerel", _symbol = "Bq", utype = "radioactivity", scale = 1, prefixes = 1, default = "pCi", link = "Becquerel", }, ["Ci"] = { _name1 = "curie", _symbol = "Ci", utype = "radioactivity", scale = 3.7e10, prefixes = 1, default = "GBq", link = "Curie (unit)", }, ["Rd"] = { _name1 = "rutherford", _symbol = "Rd", utype = "radioactivity", scale = 1e6, prefixes = 1, default = "MBq", link = "Rutherford (unit)", }, ["cm/h"] = { name1 = "centimetre per hour", name1_us = "centimeter per hour", name2 = "centimetres per hour", name2_us = "centimeters per hour", symbol = "cm/h", utype = "speed", scale = 2.7777777777777775e-6, default = "in/h", link = "Metre per second", }, ["cm/s"] = { name1 = "centimetre per second", name1_us = "centimeter per second", name2 = "centimetres per second", name2_us = "centimeters per second", symbol = "cm/s", utype = "speed", scale = 0.01, default = "in/s", link = "Metre per second", }, ["cm/year"] = { name1 = "centimetre per year", name1_us = "centimeter per year", name2 = "centimetres per year", name2_us = "centimeters per year", symbol = "cm/year", utype = "speed", scale = 3.168873850681143e-10, default = "in/year", link = "Orders of magnitude (speed)", }, ["foot/s"] = { name1 = "foot per second", name2 = "foot per second", symbol = "ft/s", utype = "speed", scale = 0.3048, default = "m/s", }, ["ft/min"] = { name1 = "foot per minute", name2 = "feet per minute", symbol = "ft/min", utype = "speed", scale = 0.00508, default = "m/min", link = "Feet per second", }, ["ft/s"] = { name1 = "foot per second", name2 = "feet per second", symbol = "ft/s", utype = "speed", scale = 0.3048, default = "m/s", link = "Feet per second", }, ["furlong per fortnight"] = { name2 = "furlongs per fortnight", symbol = "furlong per fortnight", usename = 1, utype = "speed", scale = 0.00016630952380952381, default = "km/h mph", link = "FFF system", }, ["in/h"] = { name1 = "inch per hour", name2 = "inches per hour", symbol = "in/h", utype = "speed", scale = 7.0555555555555559e-6, default = "cm/h", link = "Inch", }, ["in/s"] = { name1 = "inch per second", name2 = "inches per second", symbol = "in/s", utype = "speed", scale = 0.0254, default = "cm/s", link = "Inch", }, ["in/year"] = { name1 = "inch per year", name2 = "inches per year", symbol = "in/year", utype = "speed", scale = 8.0489395807301024e-10, default = "cm/year", link = "Orders of magnitude (speed)", }, ["isp"] = { name1 = "second", symbol = "s", utype = "speed", scale = 9.80665, default = "km/s", link = "Specific impulse", }, ["km/d"] = { name1 = "kilometre per day", name1_us = "kilometer per day", name2 = "kilometres per day", name2_us = "kilometers per day", symbol = "km/d", utype = "speed", scale = 1.1574074074074074e-2, default = "mi/d", link = "Orders of magnitude (speed)", }, ["km/h"] = { name1 = "kilometre per hour", name1_us = "kilometer per hour", name2 = "kilometres per hour", name2_us = "kilometers per hour", symbol = "km/h", utype = "speed", scale = 0.27777777777777779, default = "mph", link = "Kilometres per hour", }, ["km/s"] = { name1 = "kilometre per second", name1_us = "kilometer per second", name2 = "kilometres per second", name2_us = "kilometers per second", symbol = "km/s", utype = "speed", scale = 1000, default = "mi/s", link = "Metre per second", }, ["kn"] = { name1 = "knot", symbol = "kn", utype = "speed", scale = 0.51444444444444448, default = "km/h mph", link = "Knot (unit)", }, ["kNs/kg"] = { name2 = "kN&#8209;s/kg", symbol = "kN&#8209;s/kg", utype = "speed", scale = 1000, default = "isp", link = "Specific impulse", }, ["m/min"] = { name1 = "metre per minute", name1_us = "meter per minute", name2 = "metres per minute", name2_us = "meters per minute", symbol = "m/min", utype = "speed", scale = 0.016666666666666666, default = "ft/min", link = "Metre per second", }, ["m/s"] = { name1 = "metre per second", name1_us = "meter per second", name2 = "metres per second", name2_us = "meters per second", symbol = "m/s", utype = "speed", scale = 1, default = "ft/s", }, ["Mach"] = { name2 = "Mach", symbol = "Mach", utype = "speed", builtin = "mach", scale = 0, iscomplex= true, default = "km/h mph", link = "Mach number", }, ["mi/d"] = { name1 = "mile per day", name2 = "miles per day", symbol = "mi/d", utype = "speed", scale = 1.8626666666666667e-2, default = "km/d", link = "Orders of magnitude (speed)", }, ["mi/s"] = { name1 = "mile per second", name2 = "miles per second", symbol = "mi/s", utype = "speed", scale = 1609.344, default = "km/s", link = "Mile", }, ["mm/h"] = { name1 = "millimetre per hour", name1_us = "millimeter per hour", name2 = "millimetres per hour", name2_us = "millimeters per hour", symbol = "mm/h", utype = "speed", scale = 2.7777777777777781e-7, default = "in/h", link = "Metre per second", }, ["mph"] = { name1 = "mile per hour", name2 = "miles per hour", symbol = "mph", utype = "speed", scale = 0.44704, default = "km/h", link = "Miles per hour", }, ["Ns/kg"] = { name2 = "N&#8209;s/kg", symbol = "N&#8209;s/kg", utype = "speed", scale = 1, default = "isp", link = "Specific impulse", }, ["si tsfc"] = { name2 = "g/(kN⋅s)", symbol = "g/(kN⋅s)", utype = "speed", scale = 9.9999628621379242e-7, invert = -1, iscomplex= true, default = "tsfc", link = "Thrust specific fuel consumption", }, ["tsfc"] = { name2 = "lb/(lbf⋅h)", symbol = "lb/(lbf⋅h)", utype = "speed", scale = 2.832545036049801e-5, invert = -1, iscomplex= true, default = "si tsfc", link = "Thrust specific fuel consumption", }, ["cm/y"] = { target = "cm/year", }, ["cm/yr"] = { target = "cm/year", }, ["in/y"] = { target = "in/year", }, ["in/yr"] = { target = "in/year", }, ["knot"] = { target = "kn", }, ["knots"] = { target = "kn", }, ["kph"] = { target = "km/h", }, ["mi/h"] = { target = "mph", }, ["mm/s"] = { per = { "mm", "s" }, utype = "speed", default = "in/s", link = "Metre per second", }, ["C"] = { name1 = "degree Celsius", name2 = "degrees Celsius", symbol = "°C", usesymbol= 1, utype = "temperature", scale = 1, offset = -273.15, iscomplex= true, istemperature= true, default = "F", link = "Celsius", }, ["F"] = { name1 = "degree Fahrenheit", name2 = "degrees Fahrenheit", symbol = "°F", usesymbol= 1, utype = "temperature", scale = 0.55555555555555558, offset = 32-273.15*(9/5), iscomplex= true, istemperature= true, default = "C", link = "Fahrenheit", }, ["K"] = { _name1 = "kelvin", _symbol = "K", usesymbol= 1, utype = "temperature", scale = 1, offset = 0, iscomplex= true, istemperature= true, prefixes = 1, default = "C F", link = "Kelvin", }, ["keVT"] = { name1 = "kiloelectronvolt", symbol = "keV", utype = "temperature", scale = 11.604505e6, offset = 0, iscomplex= true, default = "MK", link = "Electronvolt", }, ["R"] = { name1 = "degree Rankine", name2 = "degrees Rankine", symbol = "°R", usesymbol= 1, utype = "temperature", scale = 0.55555555555555558, offset = 0, iscomplex= true, istemperature= true, default = "K F C", link = "Rankine scale", }, ["Celsius"] = { target = "C", }, ["°C"] = { target = "C", }, ["°F"] = { target = "F", }, ["°R"] = { target = "R", }, ["C-change"] = { name1 = "degree Celsius change", name2 = "degrees Celsius change", symbol = "°C", usesymbol= 1, utype = "temperature change", scale = 1, default = "F-change", link = "Celsius", }, ["F-change"] = { name1 = "degree Fahrenheit change", name2 = "degrees Fahrenheit change", symbol = "°F", usesymbol= 1, utype = "temperature change", scale = 0.55555555555555558, default = "C-change", link = "Fahrenheit", }, ["K-change"] = { name1 = "kelvin change", name2 = "kelvins change", symbol = "K", usesymbol= 1, utype = "temperature change", scale = 1, default = "F-change", link = "Kelvin", }, ["°C-change"] = { target = "C-change", }, ["°F-change"] = { target = "F-change", }, ["century"] = { name1 = "century", name2 = "centuries", symbol = "ha", utype = "time", scale = 3155760000, default = "Gs", }, ["d"] = { name1 = "day", symbol = "d", utype = "time", scale = 86400, default = "ks", }, ["decade"] = { name1 = "decade", symbol = "daa", utype = "time", scale = 315576000, default = "Ms", }, ["dog year"] = { name1 = "dog year", symbol = "dog yr", utype = "time", scale = 220903200, default = "years", link = "List of unusual units of measurement#Dog year", }, ["fortnight"] = { symbol = "fortnight", usename = 1, utype = "time", scale = 1209600, default = "week", }, ["h"] = { name1 = "hour", symbol = "h", utype = "time", scale = 3600, default = "ks", }, ["long billion year"] = { name1 = "billion years", name2 = "billion years", symbol = "Ta", utype = "time", scale = 31557600000000000000, default = "Es", link = "Annum", }, ["millennium"] = { name1 = "millennium", name2 = "millennia", symbol = "ka", utype = "time", scale = 31557600000, default = "Gs", }, ["milliard year"] = { name1 = "milliard years", name2 = "milliard years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["million year"] = { name1 = "million years", name2 = "million years", symbol = "Ma", utype = "time", scale = 31557600000000, default = "Ts", link = "Annum", }, ["min"] = { name1 = "minute", symbol = "min", utype = "time", scale = 60, default = "s", }, ["month"] = { symbol = "month", usename = 1, utype = "time", scale = 2629800, default = "Ms", }, ["months"] = { name1 = "month", symbol = "mo", utype = "time", scale = 2629800, default = "year", }, ["s"] = { _name1 = "second", _symbol = "s", utype = "time", scale = 1, prefixes = 1, default = "v < 7200 ! min ! h", link = "Second", }, ["short billion year"] = { name1 = "billion years", name2 = "billion years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["short trillion year"] = { name1 = "trillion years", name2 = "trillion years", symbol = "Ta", utype = "time", scale = 31557600000000000000, default = "Es", link = "Annum", }, ["thousand million year"] = { name1 = "thousand million years", name2 = "thousand million years", symbol = "Ga", utype = "time", scale = 31557600000000000, default = "Ps", link = "Annum", }, ["wk"] = { symbol = "week", usename = 1, utype = "time", scale = 604800, default = "Ms", }, ["year"] = { name1 = "year", symbol = "a", utype = "time", scale = 31557600, default = "Ms", link = "Annum", }, ["years"] = { name1 = "year", symbol = "yr", utype = "time", scale = 31557600, default = "Ms", link = "Annum", }, ["byr"] = { target = "short billion year", }, ["day"] = { target = "d", }, ["days"] = { target = "d", }, ["dog yr"] = { target = "dog year", }, ["Gyr"] = { target = "thousand million year", }, ["hour"] = { target = "h", }, ["hours"] = { target = "h", }, ["kMyr"] = { target = "thousand million year", }, ["kmyr"] = { target = "thousand million year", }, ["kyr"] = { target = "millennium", }, ["long byr"] = { target = "long billion year", }, ["minute"] = { target = "min", }, ["minutes"] = { target = "min", }, ["mth"] = { target = "month", }, ["Myr"] = { target = "million year", }, ["myr"] = { target = "million year", }, ["sec"] = { target = "s", }, ["second"] = { target = "s", }, ["seconds"] = { target = "s", }, ["tmyr"] = { target = "thousand million year", }, ["tryr"] = { target = "short trillion year", }, ["tyr"] = { target = "millennium", }, ["week"] = { target = "wk", }, ["weeks"] = { target = "wk", }, ["yr"] = { target = "year", }, ["kg.m"] = { name1 = "kilogram metre", name1_us = "kilogram meter", symbol = "kg⋅m", utype = "torque", scale = 9.80665, default = "Nm lbft", link = "Kilogram metre (torque)", }, ["kgf.m"] = { name1 = "kilogram force-metre", name1_us = "kilogram force-meter", symbol = "kgf⋅m", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["kgm"] = { name1 = "kilogram metre", name1_us = "kilogram meter", symbol = "kg⋅m", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["kpm"] = { name1 = "kilopond metre", name1_us = "kilopond meter", symbol = "kp⋅m", utype = "torque", scale = 9.80665, default = "Nm lbft", link = "Kilogram metre (torque)", }, ["lb-fft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "ft⋅lb<sub>f</sub>", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lb.ft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "lb⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lb.in"] = { name1 = "pound force-inch", symbol = "lb⋅in", utype = "torque", scale = 0.1129848290276167, default = "mN.m", link = "Pound-foot (torque)", }, ["lbfft"] = { name1 = "pound force-foot", name2 = "pound force-feet", symbol = "lbf⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["lbft"] = { name1 = "pound-foot", name2 = "pound-feet", symbol = "lb⋅ft", utype = "torque", scale = 1.3558179483314004, default = "Nm", link = "Pound-foot (torque)", }, ["m.kg-f"] = { name1 = "metre kilogram-force", name1_us = "meter kilogram-force", name2 = "metre kilograms-force", name2_us = "meter kilograms-force", symbol = "m⋅kg<sub>f</sub>", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["m.kgf"] = { name1 = "metre kilogram-force", name1_us = "meter kilogram-force", name2 = "metre kilograms-force", name2_us = "meter kilograms-force", symbol = "m⋅kgf", utype = "torque", scale = 9.80665, default = "Nm lbfft", link = "Kilogram metre (torque)", }, ["mN.m"] = { name1 = "millinewton-metre", name1_us = "millinewton-meter", symbol = "mN⋅m", utype = "torque", scale = 0.001, default = "lb.in", link = "Newton-metre", }, ["Nm"] = { _name1 = "newton-metre", _name1_us= "newton-meter", _symbol = "N⋅m", utype = "torque", alttype = "energy", scale = 1, prefixes = 1, default = "lbfft", link = "Newton-metre", }, ["kN/m"] = { per = { "kN", "-m-stiff" }, utype = "torque", default = "lbf/in", }, ["lbf/in"] = { per = { "lbf", "-in-stiff" }, utype = "torque", default = "kN/m", }, ["lb-f.ft"] = { target = "lb-fft", }, ["lbf.ft"] = { target = "lbfft", }, ["lbf·ft"] = { target = "lbfft", }, ["lb·ft"] = { target = "lb.ft", }, ["mkg-f"] = { target = "m.kg-f", }, ["mkgf"] = { target = "m.kgf", }, ["N.m"] = { target = "Nm", }, ["N·m"] = { target = "Nm", }, ["ton-mile"] = { symbol = "ton-mile", usename = 1, utype = "transportation", scale = 1.4599723182105602, default = "tkm", }, ["tkm"] = { name1 = "tonne-kilometre", name1_us = "tonne-kilometer", symbol = "tkm", utype = "transportation", scale = 1, default = "ton-mile", }, ["-12USoz(mL)serve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;mL) serving", utype = "volume", scale = 0.00035488235475000004, default = "mL", link = "Beverage can#Standard sizes", }, ["-12USoz(ml)serve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz (355&nbsp;ml) serving", utype = "volume", scale = 0.00035488235475000004, default = "ml", link = "Beverage can#Standard sizes", }, ["-12USozserve"] = { name1_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz serving", symbol = "12&nbsp;US&nbsp;fl&nbsp;oz serving", sym_us = "12&nbsp;U.S.&nbsp;fl&nbsp;oz serving", utype = "volume", scale = 0.00035488235475000004, default = "mL", link = "Beverage can#Standard sizes", }, ["acre-foot"] = { name1 = "acre-foot", name2 = "acre-foot", symbol = "acre⋅ft", utype = "volume", scale = 1233.48183754752, default = "m3", }, ["acre-ft"] = { name1 = "acre-foot", name2 = "acre-feet", symbol = "acre⋅ft", utype = "volume", scale = 1233.48183754752, default = "m3", }, ["AUtbsp"] = { name1 = "Australian tablespoon", symbol = "AU&nbsp;tbsp", utype = "volume", scale = 0.000020, default = "ml", }, ["Bcuft"] = { name1 = "billion cubic foot", name2 = "billion cubic feet", symbol = "billion cu&nbsp;ft", utype = "volume", scale = 28316846.592, default = "Gl", link = "Cubic foot", }, ["bdft"] = { name1 = "board foot", name2 = "board feet", symbol = "bd&nbsp;ft", utype = "volume", scale = 0.0023597372167, default = "m3", }, ["board feet"] = { name2 = "board feet", symbol = "board foot", usename = 1, utype = "volume", scale = 0.0023597372167, default = "m3", }, ["board foot"] = { name2 = "board foot", symbol = "board foot", usename = 1, utype = "volume", scale = 0.0023597372167, default = "m3", }, ["cc"] = { name1 = "cubic centimetre", name1_us = "cubic centimeter", symbol = "cc", utype = "volume", scale = 0.000001, default = "cuin", }, ["CID"] = { name1 = "cubic inch", name2 = "cubic inches", symbol = "cu&nbsp;in", utype = "volume", scale = 0.000016387064, default = "cc", link = "Cubic inch#Engine displacement", }, ["cord"] = { symbol = "cord", utype = "volume", scale = 3.624556363776, default = "m3", link = "Cord (unit)", }, ["cufoot"] = { name1 = "cubic foot", name2 = "cubic foot", symbol = "cu&nbsp;ft", utype = "volume", scale = 0.028316846592, default = "m3", }, ["cuft"] = { name1 = "cubic foot", name2 = "cubic feet", symbol = "cu&nbsp;ft", utype = "volume", scale = 0.028316846592, default = "m3", }, ["cuin"] = { name1 = "cubic inch", name2 = "cubic inches", symbol = "cu&nbsp;in", utype = "volume", scale = 0.000016387064, default = "cm3", }, ["cumi"] = { name1 = "cubic mile", symbol = "cu&nbsp;mi", utype = "volume", scale = 4168181825.440579584, default = "km3", }, ["cuyd"] = { name1 = "cubic yard", symbol = "cu&nbsp;yd", utype = "volume", scale = 0.764554857984, default = "m3", }, ["firkin"] = { symbol = "firkin", usename = 1, utype = "volume", scale = 0.04091481, default = "L impgal USgal", link = "Firkin (unit)", }, ["foot3"] = { target = "cufoot", }, ["Goilbbl"] = { name1 = "billion barrels", name2 = "billion barrels", symbol = "Gbbl", utype = "volume", scale = 158987294.928, default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3", link = "Barrel (unit)#Oil barrel", }, ["gr water"] = { name1 = "grains water", name2 = "grains water", symbol = "gr H<sub>2</sub>O", utype = "volume", scale = 0.00000006479891, default = "cm3", link = "Grain (unit)", }, ["grt"] = { name1 = "gross register ton", symbol = "grt", utype = "volume", scale = 2.8316846592, default = "m3", link = "Gross register tonnage", }, ["impbbl"] = { name1 = "imperial barrel", symbol = "imp&nbsp;bbl", utype = "volume", scale = 0.16365924, default = "L impgal USgal", link = "Barrel (unit)", }, ["impbsh"] = { name1 = "imperial bushel", symbol = "imp&nbsp;bsh", utype = "volume", scale = 0.03636872, default = "L impgal USdrygal", }, ["impbu"] = { name1 = "imperial bushel", symbol = "imp&nbsp;bu", utype = "volume", scale = 0.03636872, default = "m3", }, ["impgal"] = { name1 = "imperial gallon", symbol = "imp&nbsp;gal", utype = "volume", scale = 0.00454609, default = "L USgal", }, ["impgi"] = { name1 = "gill", symbol = "gi", utype = "volume", scale = 0.0001420653125, default = "ml USoz", link = "Gill (unit)", }, ["impkenning"] = { name1 = "imperial kenning", symbol = "kenning", utype = "volume", scale = 0.01818436, default = "L USdrygal", link = "Kenning (unit)", }, ["impoz"] = { name1 = "imperial fluid ounce", symbol = "imp&nbsp;fl&nbsp;oz", utype = "volume", scale = 0.0000284130625, default = "ml USoz", }, ["imppk"] = { name1 = "imperial peck", symbol = "pk", utype = "volume", scale = 0.00909218, default = "L USdrygal", link = "Peck", }, ["imppt"] = { name1 = "imperial pint", symbol = "imp&nbsp;pt", utype = "volume", scale = 0.00056826125, default = "L", }, ["impqt"] = { name1 = "imperial quart", symbol = "imp&nbsp;qt", utype = "volume", scale = 0.0011365225, default = "ml USoz", customary= 3, }, ["kilderkin"] = { symbol = "kilderkin", usename = 1, utype = "volume", scale = 0.08182962, default = "L impgal USgal", }, ["koilbbl"] = { name1 = "thousand barrels", name2 = "thousand barrels", symbol = "kbbl", utype = "volume", scale = 158.987294928, default = "v * 1.58987294928 < 10 ! ! e3 ! m3", link = "Barrel (unit)#Oil barrel", }, ["L"] = { _name1 = "litre", _name1_us= "liter", _symbol = "L", utype = "volume", scale = 0.001, prefixes = 1, default = "impgal USgal", link = "Litre", }, ["l"] = { _name1 = "litre", _name1_us= "liter", _symbol = "l", utype = "volume", scale = 0.001, prefixes = 1, default = "impgal USgal", link = "Litre", }, ["ll"] = { name1 = "litre", name1_us = "liter", symbol = "l", utype = "volume", scale = 0.001, default = "impgal USgal", }, ["m3"] = { _name1 = "cubic metre", _name1_us= "cubic meter", _symbol = "m<sup>3</sup>", prefix_position= 7, utype = "volume", scale = 1, prefixes = 3, default = "cuft", link = "Cubic metre", }, ["Mbbl"] = { name1 = "thousand barrels", name2 = "thousand barrels", symbol = "Mbbl", utype = "volume", scale = 158.987294928, default = "v * 1.58987294928 < 10 ! e3 ! ! m3", link = "Barrel (unit)#Oil barrel", }, ["MMoilbbl"] = { name1 = "million barrels", name2 = "million barrels", symbol = "MMbbl", utype = "volume", scale = 158987.294928, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3", link = "Barrel (unit)#Oil barrel", }, ["Moilbbl"] = { name1 = "million barrels", name2 = "million barrels", symbol = "Mbbl", utype = "volume", scale = 158987.294928, default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3", link = "Barrel (unit)#Oil barrel", }, ["MTON"] = { name1 = "measurement ton", symbol = "MTON", utype = "volume", scale = 1.13267386368, default = "m3", }, ["MUSgal"] = { name1 = "million US gallons", name1_us = "million U.S. gallons", name2 = "million US gallons", name2_us = "million U.S. gallons", symbol = "million US&nbsp;gal", sym_us = "million U.S.&nbsp;gal", utype = "volume", scale = 3785.411784, default = "Ml", link = "US gallon", }, ["oilbbl"] = { name1 = "barrel", symbol = "bbl", utype = "volume", scale = 0.158987294928, default = "m3", link = "Barrel (unit)#Oil barrel", }, ["stere"] = { symbol = "stere", usename = 1, utype = "volume", scale = 1, default = "cuft", }, ["Toilbbl"] = { name1 = "trillion barrels", name2 = "trillion barrels", symbol = "Tbbl", utype = "volume", scale = 158987294928, default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3", link = "Barrel (unit)#Oil barrel", }, ["USbbl"] = { name1 = "US barrel", name1_us = "U.S. barrel", symbol = "US&nbsp;bbl", sym_us = "U.S.&nbsp;bbl", utype = "volume", scale = 0.119240471196, default = "L USgal impgal", link = "Barrel (unit)", }, ["USbeerbbl"] = { name1 = "US beer barrel", name1_us = "U.S. beer barrel", symbol = "US&nbsp;bbl", sym_us = "U.S.&nbsp;bbl", utype = "volume", scale = 0.117347765304, default = "L USgal impgal", link = "Barrel (unit)", }, ["USbsh"] = { name1 = "US bushel", name1_us = "U.S. bushel", symbol = "US&nbsp;bsh", sym_us = "U.S.&nbsp;bsh", utype = "volume", scale = 0.03523907016688, default = "L USdrygal impgal", link = "Bushel", }, ["USbu"] = { name1 = "US bushel", name1_us = "U.S. bushel", symbol = "US&nbsp;bu", sym_us = "U.S.&nbsp;bu", utype = "volume", scale = 0.03523907016688, default = "L USdrygal impgal", link = "Bushel", }, ["USdrybbl"] = { name1 = "US dry barrel", name1_us = "U.S. dry barrel", symbol = "US&nbsp;dry&nbsp;bbl", sym_us = "U.S.&nbsp;dry&nbsp;bbl", utype = "volume", scale = 0.11562819898508, default = "m3", link = "Barrel (unit)", }, ["USdrygal"] = { name1 = "US dry gallon", name1_us = "U.S. dry gallon", symbol = "US&nbsp;dry&nbsp;gal", sym_us = "U.S.&nbsp;dry&nbsp;gal", utype = "volume", scale = 0.00440488377086, default = "L", link = "Gallon", }, ["USdrypt"] = { name1 = "US dry pint", name1_us = "U.S. dry pint", symbol = "US&nbsp;dry&nbsp;pt", sym_us = "U.S.&nbsp;dry&nbsp;pt", utype = "volume", scale = 0.0005506104713575, default = "ml", link = "Pint", }, ["USdryqt"] = { name1 = "US dry quart", name1_us = "U.S. dry quart", symbol = "US&nbsp;dry&nbsp;qt", sym_us = "U.S.&nbsp;dry&nbsp;qt", utype = "volume", scale = 0.001101220942715, default = "ml", link = "Quart", }, ["USflgal"] = { name1 = "US gallon", name1_us = "U.S. gallon", symbol = "US fl gal", sym_us = "U.S.&nbsp;fl&nbsp;gal", utype = "volume", scale = 0.003785411784, default = "L impgal", link = "Gallon", }, ["USgal"] = { name1 = "US gallon", name1_us = "U.S. gallon", symbol = "US&nbsp;gal", sym_us = "U.S.&nbsp;gal", utype = "volume", scale = 0.003785411784, default = "L impgal", }, ["USgi"] = { name1 = "gill", symbol = "gi", utype = "volume", scale = 0.0001182941183, default = "ml impoz", link = "Gill (unit)", }, ["USkenning"] = { name1 = "US kenning", name1_us = "U.S. kenning", symbol = "US&nbsp;kenning", sym_us = "U.S.&nbsp;kenning", utype = "volume", scale = 0.01761953508344, default = "L impgal", link = "Kenning (unit)", }, ["USmin"] = { name1 = "US minim", name1_us = "U.S. minim", symbol = "US&nbsp;min", sym_us = "U.S.&nbsp;min", utype = "volume", scale = 0.000000061611519921875, default = "ml", link = "Minim (unit)", }, ["USoz"] = { name1 = "US fluid ounce", name1_us = "U.S. fluid ounce", symbol = "US&nbsp;fl&nbsp;oz", sym_us = "U.S.&nbsp;fl&nbsp;oz", utype = "volume", scale = 0.0000295735295625, default = "ml", }, ["USpk"] = { name1 = "US peck", name1_us = "U.S. peck", symbol = "US&nbsp;pk", sym_us = "U.S.&nbsp;pk", utype = "volume", scale = 0.00880976754172, default = "L impgal", link = "Peck", }, ["USpt"] = { name1 = "US pint", name1_us = "U.S. pint", symbol = "US&nbsp;pt", sym_us = "U.S.&nbsp;pt", utype = "volume", scale = 0.000473176473, default = "L imppt", link = "Pint", }, ["USqt"] = { name1 = "US quart", name1_us = "U.S. quart", symbol = "US&nbsp;qt", sym_us = "U.S.&nbsp;qt", utype = "volume", scale = 0.000946352946, default = "ml", link = "Quart", customary= 1, }, ["USquart"] = { name1 = "US quart", name1_us = "U.S. quart", symbol = "US&nbsp;qt", sym_us = "U.S.&nbsp;qt", utype = "volume", scale = 0.000946352946, default = "ml impoz", link = "Quart", }, ["UStbsp"] = { name1 = "US tablespoon", name1_us = "U.S. tablespoon", symbol = "US&nbsp;tbsp", sym_us = "U.S.&nbsp;tbsp", utype = "volume", scale = 1.4786764781250001e-5, default = "ml", }, ["winecase"] = { symbol = "case", usename = 1, utype = "volume", scale = 0.009, default = "L", link = "Case (goods)", }, ["*U.S.drygal"] = { target = "USdrygal", sp_us = true, customary= 2, }, ["*U.S.gal"] = { target = "USgal", sp_us = true, customary= 2, }, ["+USdrygal"] = { target = "USdrygal", customary= 1, }, ["+usfloz"] = { target = "USoz", link = "Fluid ounce", customary= 1, }, ["+USgal"] = { target = "USgal", customary= 1, }, ["+USoz"] = { target = "USoz", customary= 1, }, ["@impgal"] = { target = "impgal", link = "Gallon", customary= 3, }, ["acre feet"] = { target = "acre-ft", }, ["acre foot"] = { target = "acre-foot", }, ["acre ft"] = { target = "acre-ft", }, ["acre-feet"] = { target = "acre-ft", }, ["acre.foot"] = { target = "acre-foot", }, ["acre.ft"] = { target = "acre-ft", }, ["acre·ft"] = { target = "acre-ft", }, ["bushels"] = { target = "USbsh", }, ["cid"] = { target = "CID", }, ["ft3"] = { target = "cuft", }, ["gal"] = { target = "USgal", }, ["gallon"] = { shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallon%})", }, ["gallons"] = { shouldbe = "Use %{USgal%} for US gallons or %{impgal%} for imperial gallons (not %{gallons%})", }, ["Gcuft"] = { target = "e9cuft", }, ["impfloz"] = { target = "impoz", }, ["Impgal"] = { target = "impgal", }, ["in3"] = { target = "cuin", symbol = "in<sup>3</sup>", }, ["hm³"] = { target = "hm3", }, ["kcuft"] = { target = "e3cuft", }, ["kcum"] = { target = "e3m3", }, ["km³"] = { target = "km3", }, ["liter"] = { target = "L", sp_us = true, }, ["liters"] = { target = "L", sp_us = true, }, ["litre"] = { target = "L", }, ["litres"] = { target = "L", }, ["Mcuft"] = { target = "e6cuft", }, ["Mcum"] = { target = "e6m3", }, ["Mft3"] = { target = "e6cuft", }, ["mi3"] = { target = "cumi", }, ["m³"] = { target = "m3", }, ["Pcuft"] = { target = "e15cuft", }, ["pt"] = { shouldbe = "Use %{USpt%} for US pints or %{imppt%} for imperial pints (not %{pt%})", }, ["qt"] = { shouldbe = "Use %{USqt%} for US quarts or %{impqt%} for imperial quarts (not %{qt%})", }, ["Tcuft"] = { target = "e12cuft", }, ["Tft3"] = { target = "e12cuft", }, ["U.S.bbl"] = { target = "USbbl", sp_us = true, default = "L U.S.gal impgal", }, ["U.S.beerbbl"] = { target = "USbeerbbl", sp_us = true, default = "L U.S.gal impgal", }, ["U.S.bsh"] = { target = "USbsh", sp_us = true, default = "L U.S.drygal impgal", }, ["U.S.bu"] = { target = "USbu", sp_us = true, default = "L U.S.drygal impgal", }, ["U.S.drybbl"] = { target = "USdrybbl", sp_us = true, }, ["U.S.drygal"] = { target = "USdrygal", sp_us = true, }, ["U.S.drypt"] = { target = "USdrypt", sp_us = true, }, ["U.S.dryqt"] = { target = "USdryqt", sp_us = true, }, ["U.S.flgal"] = { target = "USflgal", sp_us = true, }, ["U.S.floz"] = { target = "USoz", sp_us = true, }, ["U.S.gal"] = { target = "USgal", sp_us = true, link = "U.S. gallon", }, ["u.s.gal"] = { target = "USgal", sp_us = true, link = "U.S. gallon", }, ["U.S.gi"] = { target = "USgi", sp_us = true, }, ["U.S.kenning"] = { target = "USkenning", sp_us = true, }, ["U.S.oz"] = { target = "USoz", sp_us = true, }, ["U.S.pk"] = { target = "USpk", sp_us = true, }, ["U.S.pt"] = { target = "USpt", sp_us = true, }, ["U.S.qt"] = { target = "USqt", sp_us = true, default = "L impqt", customary= 2, }, ["usbbl"] = { target = "USbbl", }, ["usbeerbbl"] = { target = "USbeerbbl", }, ["usbsh"] = { target = "USbsh", }, ["usbu"] = { target = "USbu", }, ["usdrybbl"] = { target = "USdrybbl", }, ["usdrygal"] = { target = "USdrygal", }, ["usdrypt"] = { target = "USdrypt", }, ["usdryqt"] = { target = "USdryqt", }, ["USfloz"] = { target = "USoz", }, ["usfloz"] = { target = "USoz", }, ["USGAL"] = { target = "USgal", }, ["usgal"] = { target = "USgal", }, ["usgi"] = { target = "USgi", }, ["uskenning"] = { target = "USkenning", }, ["usoz"] = { target = "USoz", }, ["uspk"] = { target = "USpk", }, ["uspt"] = { target = "USpt", }, ["usqt"] = { target = "USqt", }, ["yd3"] = { target = "cuyd", }, ["cuft/sqmi"] = { per = { "cuft", "sqmi" }, utype = "volume per unit area", default = "m3/km2", }, ["m3/ha"] = { name1 = "cubic metre per hectare", name1_us = "cubic meter per hectare", name2 = "cubic metres per hectare", name2_us = "cubic meters per hectare", symbol = "m<sup>3</sup>/ha", utype = "volume per unit area", scale = 0.0001, default = "USbu/acre", link = "Hectare", }, ["m3/km2"] = { per = { "m3", "km2" }, utype = "volume per unit area", default = "cuft/sqmi", }, ["U.S.gal/acre"] = { per = { "U.S.gal", "acre" }, utype = "volume per unit area", default = "m3/km2", }, ["USbu/acre"] = { name2 = "US bushels per acre", symbol = "US bushel per acre", usename = 1, utype = "volume per unit area", scale = 8.7077638761350888e-6, default = "m3/ha", link = "Bushel", }, ["USgal/acre"] = { per = { "USgal", "acre" }, utype = "volume per unit area", default = "m3/km2", }, ["cuyd/mi"] = { per = { "cuyd", "mi" }, utype = "volume per unit length", default = "m3/km", }, ["m3/km"] = { per = { "m3", "km" }, utype = "volume per unit length", default = "cuyd/mi", }, ["mich"] = { combination= { "ch", "mi" }, multiple = { 80 }, utype = "length", }, ["michlk"] = { combination= { "chlk", "mi" }, multiple = { 80 }, utype = "length", }, ["michainlk"] = { combination= { "chainlk", "mi" }, multiple = { 80 }, utype = "length", }, ["miyd"] = { combination= { "yd", "mi" }, multiple = { 1760 }, utype = "length", }, ["miydftin"] = { combination= { "in", "ft", "yd", "mi" }, multiple = { 12, 3, 1760 }, utype = "length", }, ["mift"] = { combination= { "ft", "mi" }, multiple = { 5280 }, utype = "length", }, ["ydftin"] = { combination= { "in", "ft", "yd" }, multiple = { 12, 3 }, utype = "length", }, ["ydft"] = { combination= { "ft", "yd" }, multiple = { 3 }, utype = "length", }, ["ftin"] = { combination= { "in", "ft" }, multiple = { 12 }, utype = "length", }, ["footin"] = { combination= { "in", "foot" }, multiple = { 12 }, utype = "length", }, ["handin"] = { combination= { "in", "hand" }, multiple = { 4 }, utype = "length", }, ["lboz"] = { combination= { "oz", "lb" }, multiple = { 16 }, utype = "mass", }, ["stlb"] = { combination= { "lb", "st" }, multiple = { 14 }, utype = "mass", }, ["stlboz"] = { combination= { "oz", "lb", "st" }, multiple = { 16, 14 }, utype = "mass", }, ["st and lb"] = { combination= { "lb", "st" }, multiple = { 14 }, utype = "mass", }, ["GN LTf"] = { combination= { "GN", "-LTf" }, utype = "force", }, ["GN LTf STf"] = { combination= { "GN", "-LTf", "-STf" }, utype = "force", }, ["GN STf"] = { combination= { "GN", "-STf" }, utype = "force", }, ["GN STf LTf"] = { combination= { "GN", "-STf", "-LTf" }, utype = "force", }, ["kN LTf"] = { combination= { "kN", "-LTf" }, utype = "force", }, ["kN LTf STf"] = { combination= { "kN", "-LTf", "-STf" }, utype = "force", }, ["kN STf"] = { combination= { "kN", "-STf" }, utype = "force", }, ["kN STf LTf"] = { combination= { "kN", "-STf", "-LTf" }, utype = "force", }, ["LTf STf"] = { combination= { "-LTf", "-STf" }, utype = "force", }, ["MN LTf"] = { combination= { "MN", "-LTf" }, utype = "force", }, ["MN LTf STf"] = { combination= { "MN", "-LTf", "-STf" }, utype = "force", }, ["MN STf"] = { combination= { "MN", "-STf" }, utype = "force", }, ["MN STf LTf"] = { combination= { "MN", "-STf", "-LTf" }, utype = "force", }, ["STf LTf"] = { combination= { "-STf", "-LTf" }, utype = "force", }, ["L/100 km mpgimp"] = { combination= { "L/100 km", "mpgimp" }, utype = "fuel efficiency", }, ["l/100 km mpgimp"] = { combination= { "l/100 km", "mpgimp" }, utype = "fuel efficiency", }, ["L/100 km mpgUS"] = { combination= { "L/100 km", "mpgus" }, utype = "fuel efficiency", }, ["L/100 km mpgus"] = { combination= { "L/100 km", "mpgus" }, utype = "fuel efficiency", }, ["l/100 km mpgus"] = { combination= { "l/100 km", "mpgus" }, utype = "fuel efficiency", }, ["mpgimp L/100 km"] = { combination= { "mpgimp", "L/100 km" }, utype = "fuel efficiency", }, ["LT ST t"] = { combination= { "lt", "-ST", "t" }, utype = "mass", }, ["LT t ST"] = { combination= { "lt", "t", "-ST" }, utype = "mass", }, ["ST LT t"] = { combination= { "-ST", "lt", "t" }, utype = "mass", }, ["ST t LT"] = { combination= { "-ST", "t", "lt" }, utype = "mass", }, ["t LT ST"] = { combination= { "t", "lt", "-ST" }, utype = "mass", }, ["ton"] = { combination= { "LT", "ST" }, utype = "mass", }, ["kPa kg/cm2"] = { combination= { "kPa", "kgf/cm2" }, utype = "pressure", }, ["kPa lb/in2"] = { combination= { "kPa", "-lb/in2" }, utype = "pressure", }, ["floz"] = { combination= { "impoz", "USoz" }, utype = "volume", }, } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local default_exceptions = { -- Prefixed units with a default different from that of the base unit. -- Each key item is a prefixed symbol (unitcode for engineering notation). ["cm<sup>2</sup>"] = "sqin", ["dm<sup>2</sup>"] = "sqin", ["e3acre"] = "km2", ["e3m2"] = "e6sqft", ["e6acre"] = "km2", ["e6ha"] = "e6acre", ["e6km2"] = "e6sqmi", ["e6m2"] = "e6sqft", ["e6sqft"] = "v * 9.290304 < 100 ! e3 ! e6 ! m2", ["e6sqmi"] = "e6km2", ["hm<sup>2</sup>"] = "acre", ["km<sup>2</sup>"] = "sqmi", ["mm<sup>2</sup>"] = "sqin", ["aJ"] = "eV", ["e3BTU"] = "MJ", ["e6BTU"] = "GJ", ["EJ"] = "kWh", ["fJ"] = "keV", ["GJ"] = "kWh", ["MJ"] = "kWh", ["PJ"] = "kWh", ["pJ"] = "MeV", ["TJ"] = "kWh", ["YJ"] = "kWh", ["yJ"] = "μeV", ["ZJ"] = "kWh", ["zJ"] = "meV", ["e12cuft/a"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/a", ["e12cuft/d"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/d", ["e12m3/a"] = "Tcuft/a", ["e12m3/d"] = "Tcuft/d", ["e3cuft/a"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/a", ["e3cuft/d"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/d", ["e3cuft/s"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/s", ["e3m3/a"] = "v < 28.316846592 ! k ! M ! cuft/a", ["e3m3/d"] = "v < 28.316846592 ! k ! M ! cuft/d", ["e3m3/s"] = "v < 28.316846592 ! k ! M ! cuft/s", ["e3USgal/a"] = "v * 3.785411784 < 1000 ! ! e3 ! m3/a", ["e6cuft/a"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/a", ["e6cuft/d"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/d", ["e6cuft/s"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/s", ["e6m3/a"] = "v < 28.316846592 ! M ! G ! cuft/a", ["e6m3/d"] = "v < 28.316846592 ! M ! G ! cuft/d", ["e6m3/s"] = "v < 28.316846592 ! e6 ! e9 ! cuft/s", ["e6USgal/a"] = "v * 3.785411784 < 1000 ! e3 ! e6 ! m3/a", ["e9cuft/a"] = "m3/a", ["e9cuft/d"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3/d", ["e9m3/a"] = "v < 28.316846592 ! G ! T ! cuft/a", ["e9m3/d"] = "v < 28.316846592 ! G ! T ! cuft/d", ["e9m3/s"] = "v < 28.316846592 ! e9 ! e12 ! cuft/s", ["e9USgal/a"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/a", ["e9USgal/s"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/s", ["nN"] = "gr-f", ["μN"] = "gr-f", ["mN"] = "oz-f", ["am"] = "in", ["cm"] = "in", ["dam"] = "ft", ["dm"] = "in", ["e12km"] = "e12mi", ["e12mi"] = "e12km", ["e3AU"] = "ly", ["e3km"] = "e3mi", ["e3mi"] = "e3km", ["e6km"] = "e6mi", ["e6mi"] = "e6km", ["e9km"] = "AU", ["e9mi"] = "e9km", ["Em"] = "mi", ["fm"] = "in", ["Gm"] = "mi", ["hm"] = "ft", ["km"] = "mi", ["mm"] = "in", ["Mm"] = "mi", ["nm"] = "in", ["Pm"] = "mi", ["pm"] = "in", ["Tm"] = "mi", ["Ym"] = "mi", ["ym"] = "in", ["Zm"] = "mi", ["zm"] = "in", ["μm"] = "in", ["e12lb"] = "v * 4.5359237 < 10 ! Mt ! Gt", ["e3lb"] = "v * 4.5359237 < 10 ! kg ! t", ["e3ozt"] = "v * 0.311034768 < 10 ! kg ! t", ["e3t"] = "LT ST", ["e6carat"] = "t", ["e6lb"] = "v * 4.5359237 < 10 ! t ! kilotonne", ["e6ozt"] = "lb kg", ["e6ST"] = "Mt", ["e6t"] = "LT ST", ["e9lb"] = "v * 4.5359237 < 10 ! kilotonne ! Mt", ["e9t"] = "LT ST", ["Gg"] = "lb", ["kg"] = "lb", ["mg"] = "gr", ["Mg"] = "LT ST", ["ng"] = "gr", ["μg"] = "gr", ["mBq"] = "fCi", ["kBq"] = "nCi", ["MBq"] = "μCi", ["GBq"] = "mCi", ["TBq"] = "Ci", ["PBq"] = "kCi", ["EBq"] = "kCi", ["fCi"] = "mBq", ["pCi"] = "Bq", ["nCi"] = "Bq", ["μCi"] = "kBq", ["mCi"] = "MBq", ["kCi"] = "TBq", ["MCi"] = "PBq", ["ns"] = "μs", ["μs"] = "ms", ["ms"] = "s", ["ks"] = "h", ["Ms"] = "week", ["Gs"] = "decade", ["Ts"] = "millennium", ["Ps"] = "million year", ["Es"] = "thousand million year", ["MK"] = "keVT", ["cL"] = "impoz usoz", ["cl"] = "impoz usoz", ["cm<sup>3</sup>"] = "cuin", ["dL"] = "impoz usoz", ["dl"] = "impoz usoz", ["mm<sup>3</sup>"] = "cuin", ["dm<sup>3</sup>"] = "cuin", ["e12cuft"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3", ["e12impgal"] = "v * 4.54609 < 1000 ! T ! P ! l", ["e12m3"] = "v < 28.316846592 ! T ! P ! cuft", ["e12U.S.gal"] = "v * 3.785411784 < 1000 ! T ! P ! l", ["e12USgal"] = "v * 3.785411784 < 1000 ! T ! P ! l", ["e15cuft"] = "v * 2.8316846592 < 100 ! e12 ! e15 ! m3", ["e15m3"] = "Pcuft", ["e3bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3", ["e3cuft"] = "v * 2.8316846592 < 100 ! ! e3 ! m3", ["e3impgal"] = "v * 4.54609 < 1000 ! k ! M ! l", ["e3m3"] = "v < 28.316846592 ! k ! M ! cuft", ["e3U.S.gal"] = "v * 3.785411784 < 1000 ! k ! M ! l", ["e3USgal"] = "v * 3.785411784 < 1000 ! k ! M ! l", ["e6bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3", ["e6cuft"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3", ["e6cuyd"] = "v * 7.64554857984 < 10 ! e3 ! e6 ! m3", ["e6impgal"] = "v * 4.54609 < 1000 ! M ! G ! l", ["e6L"] = "USgal", ["e6m3"] = "v < 28.316846592 ! M ! G ! cuft", ["e6U.S.gal"] = "v * 3.785411784 < 1000 ! M ! G ! l", ["e6USgal"] = "v * 3.785411784 < 1000 ! M ! G ! l", ["e9bdft"] = "v * 0.23597372167 < 100 ! e6 ! e9 ! m3", ["e9cuft"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3", ["e9impgal"] = "v * 4.54609 < 1000 ! G ! T ! l", ["e9m3"] = "v < 28.316846592 ! G ! T ! cuft", ["e9U.S.gal"] = "v * 3.785411784 < 1000 ! G ! T ! l", ["e9USgal"] = "v * 3.785411784 < 1000 ! G ! T ! l", ["GL"] = "cuft", ["Gl"] = "cuft", ["kL"] = "cuft", ["kl"] = "cuft", ["km<sup>3</sup>"] = "cumi", ["mL"] = "impoz usoz", ["ml"] = "impoz usoz", ["Ml"] = "v < 28.316846592 ! e3 ! e6 ! cuft", ["ML"] = "v < 28.316846592 ! e3 ! e6 ! cuft", ["TL"] = "cumi", ["Tl"] = "cumi", ["μL"] = "cuin", ["μl"] = "cuin", } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local link_exceptions = { -- Prefixed units with a linked article different from that of the base unit. -- Each key item is a prefixed symbol (not unitcode). ["mm<sup>2</sup>"] = "Square millimetre", ["cm<sup>2</sup>"] = "Square centimetre", ["dm<sup>2</sup>"] = "Square decimetre", ["km<sup>2</sup>"] = "Square kilometre", ["kJ"] = "Kilojoule", ["MJ"] = "Megajoule", ["GJ"] = "Gigajoule", ["TJ"] = "Terajoule", ["fm"] = "Femtometre", ["pm"] = "Picometre", ["nm"] = "Nanometre", ["μm"] = "Micrometre", ["mm"] = "Millimetre", ["cm"] = "Centimetre", ["dm"] = "Decimetre", ["dam"] = "Decametre", ["hm"] = "Hectometre", ["km"] = "Kilometre", ["Mm"] = "Megametre", ["Gm"] = "Gigametre", ["Tm"] = "Terametre", ["Pm"] = "Petametre", ["Em"] = "Exametre", ["Zm"] = "Zettametre", ["Ym"] = "Yottametre", ["μg"] = "Microgram", ["mg"] = "Milligram", ["kg"] = "Kilogram", ["Mg"] = "Tonne", ["yW"] = "Yoctowatt", ["zW"] = "Zeptowatt", ["aW"] = "Attowatt", ["fW"] = "Femtowatt", ["pW"] = "Picowatt", ["nW"] = "Nanowatt", ["μW"] = "Microwatt", ["mW"] = "Milliwatt", ["kW"] = "Kilowatt", ["MW"] = "Megawatt", ["GW"] = "Gigawatt", ["TW"] = "Terawatt", ["PW"] = "Petawatt", ["EW"] = "Exawatt", ["ZW"] = "Zettawatt", ["YW"] = "Yottawatt", ["as"] = "Attosecond", ["fs"] = "Femtosecond", ["ps"] = "Picosecond", ["ns"] = "Nanosecond", ["μs"] = "Microsecond", ["ms"] = "Millisecond", ["ks"] = "Kilosecond", ["Ms"] = "Megasecond", ["Gs"] = "Gigasecond", ["Ts"] = "Terasecond", ["Ps"] = "Petasecond", ["Es"] = "Exasecond", ["Zs"] = "Zettasecond", ["Ys"] = "Yottasecond", ["mm<sup>3</sup>"] = "Cubic millimetre", ["cm<sup>3</sup>"] = "Cubic centimetre", ["dm<sup>3</sup>"] = "Cubic decimetre", ["dam<sup>3</sup>"] = "Cubic decametre", ["km<sup>3</sup>"] = "Cubic kilometre", ["μL"] = "Microlitre", ["μl"] = "Microlitre", ["mL"] = "Millilitre", ["ml"] = "Millilitre", ["cL"] = "Centilitre", ["cl"] = "Centilitre", ["dL"] = "Decilitre", ["dl"] = "Decilitre", ["daL"] = "Decalitre", ["dal"] = "Decalitre", ["hL"] = "Hectolitre", ["hl"] = "Hectolitre", ["kL"] = "Kilolitre", ["kl"] = "Kilolitre", ["ML"] = "Megalitre", ["Ml"] = "Megalitre", ["GL"] = "Gigalitre", ["Gl"] = "Gigalitre", ["TL"] = "Teralitre", ["Tl"] = "Teralitre", ["PL"] = "Petalitre", ["Pl"] = "Petalitre", } --------------------------------------------------------------------------- -- Do not change the data in this table because it is created by running -- -- a script that reads the wikitext from a wiki page (see note above). -- --------------------------------------------------------------------------- local per_unit_fixups = { -- Automatically created per units of form "x/y" may have their unit type -- changed, for example, "length/time" is changed to "speed". -- Other adjustments can also be specified. ["/area"] = "per unit area", ["/volume"] = "per unit volume", ["area/area"] = "area per unit area", ["energy/length"] = "energy per unit length", ["energy/mass"] = "energy per unit mass", ["energy/time"] = { utype = "power", link = "Power (physics)" }, ["energy/volume"] = "energy per unit volume", ["force/area"] = { utype = "pressure", link = "Pressure" }, ["length/length"] = { utype = "gradient", link = "Grade (slope)" }, ["length/time"] = { utype = "speed", link = "Speed" }, ["length/time/time"] = { utype = "acceleration", link = "Acceleration" }, ["mass/area"] = { utype = "pressure", multiplier = 9.80665 }, ["mass/length"] = "linear density", ["mass/mass"] = "concentration", ["mass/power"] = "mass per unit power", ["mass/time"] = "mass per unit time", ["mass/volume"] = { utype = "density", link = "Density" }, ["power/mass"] = "power per unit mass", ["power/volume"] = { link = "Power density" }, ["pressure/length"] = "fracture gradient", ["speed/time"] = { utype = "acceleration", link = "Acceleration" }, ["volume/area"] = "volume per unit area", ["volume/length"] = "volume per unit length", ["volume/time"] = "flow", } return { all_units = all_units, default_exceptions = default_exceptions, link_exceptions = link_exceptions, per_unit_fixups = per_unit_fixups, } 69cd04fba2962c152d0008b00cb8b7df57549e07 Module:Convert/text 828 722 1108 1107 2025-08-22T00:55:51Z Sharparam 284703 1 revision imported Scribunto text/plain -- Text used by Module:Convert for enwiki. -- This is a separate module to simplify translation for use on another wiki. -- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki. -- Some units accept an SI prefix before the unit code, such as "kg" for kilogram. local SIprefixes = { -- The prefix field is what the prefix should be, if different from the prefix used. ['Q'] = { exponent = 30, name = 'quetta', }, ['R'] = { exponent = 27, name = 'ronna', }, ['Y'] = { exponent = 24, name = 'yotta', }, ['Z'] = { exponent = 21, name = 'zetta', }, ['E'] = { exponent = 18, name = 'exa' , }, ['P'] = { exponent = 15, name = 'peta' , }, ['T'] = { exponent = 12, name = 'tera' , }, ['G'] = { exponent = 9, name = 'giga' , }, ['M'] = { exponent = 6, name = 'mega' , }, ['k'] = { exponent = 3, name = 'kilo' , }, ['h'] = { exponent = 2, name = 'hecto', }, ['da']= { exponent = 1, name = 'deca' , name_us = 'deka' }, ['d'] = { exponent = -1, name = 'deci' , }, ['c'] = { exponent = -2, name = 'centi', }, ['m'] = { exponent = -3, name = 'milli', }, ['μ'] = { exponent = -6, name = 'micro', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC ['µ'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5 ['u'] = { exponent = -6, name = 'micro', prefix = 'μ' }, -- not an SI prefix, but allow for people typing this ['n'] = { exponent = -9, name = 'nano' , }, ['p'] = { exponent =-12, name = 'pico' , }, ['f'] = { exponent =-15, name = 'femto', }, ['a'] = { exponent =-18, name = 'atto' , }, ['z'] = { exponent =-21, name = 'zepto', }, ['y'] = { exponent =-24, name = 'yocto', }, ['r'] = { exponent =-27, name = 'ronto', }, ['q'] = { exponent =-30, name = 'quecto', }, } -- Some units can be qualified with one of the following prefixes, when linked. local customary_units = { { "US", link = "United States customary units" }, { "U.S.", link = "United States customary units" }, { "imperial", link = "Imperial units" }, { "imp", link = "Imperial units" }, } -- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km"). -- key = { "name", link = "article title", exponent = numeric_key_value } -- If lk=on and link is defined, the name of the number will appear as a link. local eng_scales = { ["3"] = { "thousand", exponent = 3 }, ["6"] = { "million", exponent = 6 }, ["9"] = { "billion", link = "1000000000 (number)", exponent = 9 }, ["12"] = { "trillion", link = "1000000000000 (number)", exponent = 12 }, ["15"] = { "quadrillion", link = "1000000000000000 (number)", exponent = 15 }, } local all_categories = { unit = "[[Category:Convert errors]]", option = "[[Category:Convert errors]]", warning = '[[Category:Convert invalid options]]', tracking = '[[Category:Convert tracking]]', } -- For some error messages, the following puts the wanted style around -- each unit code marked like '...%{ft%}...'. local unitcode_regex = '%%([{}])' local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28 -- All messages that may be displayed if a problem occurs. local all_messages = { -- Message format string: $1=title, $2=text, $3=category, $4=anchor. -- Each displayed message starts with "Convert:" so can easily locate by searching article. cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>', cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>', cvt_format_preview = '<strong class="error">Error in convert: $1 [[Help:Convert messages#$4|(help)]]</strong>$3', -- Each of following messages is a table: -- { [1] = 'title', -- mouseover title text -- [2] = 'text', -- link text displayed in article -- [3] = 'category key', -- key to lookup category in all_categories -- [4] = 'anchor', -- anchor for link to relevant section on help page -- regex = gsub_regex, -- replace = gsub_table, -- } Mouseover title text Link text CatKey Anchor cvt_bad_input = { 'input "$1" must be a number and unit' , 'invalid input' , 'option', 'invalid_input' }, cvt_bad_num = { 'Value "$1" must be a number' , 'invalid number' , 'option', 'invalid_number' }, cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' }, cvt_invalid_num = { 'Number has overflowed' , 'number overflow' , 'option', 'number_overflow' }, cvt_no_num = { 'Needs the number to be converted' , 'needs a number' , 'option', 'needs_number' }, cvt_no_num2 = { 'Needs another number for a range' , 'needs another number', 'option', 'needs_another_number' }, cvt_bad_altitude = { '"$1" needs an integer' , 'invalid altitude' , 'option', 'invalid_altitude' }, cvt_bad_frac = { '"$1" needs an integer above 1' , 'invalid fraction' , 'option', 'invalid_fraction' }, cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' }, cvt_bad_sigfig = { '"$1" needs a positive integer' , 'invalid sigfig' , 'option', 'invalid_sigfig' }, cvt_empty_option = { 'Ignored empty option "$1"' , 'empty option' , 'option', 'empty_option' }, cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true }, cvt_no_spell = { 'Spelling is not available' , 'bug, ask for help' , 'option', 'ask_for_help' }, cvt_unknown_option = { 'Ignored invalid option "$1"' , 'invalid option' , 'option', 'invalid_option' }, cvt_wd_fail = { 'Unable to access Wikidata' , 'wikidata problem' , 'option', 'wikidata_problem' }, cvt_bad_default = { 'Unit "$1" has an invalid default' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' }, cvt_no_default = { 'Unit "$1" has no default output unit' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_no_unit = { 'Needs name of unit' , 'needs unit name' , 'unit' , 'needs_unit_name' }, cvt_unknown = { 'Unit name "$1" is not known' , 'unknown unit' , 'unit' , 'unknown_unit' }, cvt_should_be = { '$1' , 'ambiguous unit' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace }, cvt_mismatch = { 'Cannot convert "$1" to "$2"' , 'unit mismatch' , 'unit' , 'unit_mismatch' }, cvt_bug_convert = { 'Bug: Cannot convert between specified units', 'bug, ask for help' , 'unit' , 'ask_for_help' }, cvt_lookup = { 'Unit "$1" is incorrectly defined' , 'bug, ask for help' , 'unit' , 'ask_for_help' }, } -- Text to join input value/unit with output value/unit. local disp_joins = { -- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; " -- [wantname] gives default abbr=off ["or"] = { " or " , "" , " or ", wantname = true }, ["sqbr-sp"] = { " [" , "]" }, ["sqbr-nbsp"] = { "&nbsp;[" , "]" }, ["comma"] = { ", " , "" , ", " }, ["semicolon"] = { "; " , "" }, ["slash-sp"] = { " / " , "" , wantname = true }, ["slash-nbsp"] = { "&nbsp;/ ", "" , wantname = true }, ["slash-nosp"] = { "/" , "" , wantname = true }, ["b"] = { " (" , ")" }, ["(or)"] = { " (" , ")", " or " }, ["br"] = { "<br />" , "" , wantname = true }, ["br()"] = { "<br />(" , ")", wantname = true }, } -- Text to separate values in a range. local range_types = { -- Specifying a table requires either: -- * "off" and "on" values (for "abbr=off" and "abbr=on"), or -- * "input" and "output" values (for LHS and RHS); -- other fields are optional. -- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens. -- With "exception = true", that also occurs with "adj=on|abbr=on". -- If "adj" is defined here, that text (unchanged) is used with "adj=on". ["+"] = " + ", [","] = ",&nbsp;", [", and"] = ", and ", [", or"] = ", or ", ["by"] = " by ", ["-"] = "–", ["to about"] = " to about ", ["and"] = { off = " and ", on = " and ", exception = true }, ["and(-)"] = { input = " and ", output = "–" }, ["or"] = { off = " or " , on = " or " , exception = true }, ["to"] = { off = " to " , on = " to " , exception = true }, ["to(-)"] = { input = "&nbsp;to ", output = "–" }, ["+/-"] = { off = "&nbsp;±&nbsp;", on = "&nbsp;±&nbsp;", adj = "&nbsp;±&nbsp;", is_range_change = true }, ["by(x)"] = { input = " by ", output = " ×&nbsp;", out_range_x = true }, ["x"] = { off = " by ", on = " ×&nbsp;", abbr_range_x = true }, ["xx"] = "&nbsp;×&nbsp;", ["*"] = "×", ["/"] = "&thinsp;/&thinsp;", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}} } local range_aliases = { -- ["alternative name for a range"] = "standard range name" ["–"] = "-", ["&ndash;"] = "-", ["×"] = "x", ["&times;"] = "x", ["±"] = "+/-", ["&plusmn;"] = "+/-", } -- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}. -- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}. -- Words must be in correct order for searching, for example, 'x' after 'xx'. local range_words = { '-', '–', 'xx', 'x', '*' } local ranges = { types = range_types, aliases = range_aliases, words = range_words, } -- Valid option names. local en_option_name = { -- ["local text for option name"] = "en name used in this module" ["$"] = "$", ["abbr"] = "abbr", ["adj"] = "adj", ["altitude_ft"] = "altitude_ft", ["altitude_m"] = "altitude_m", ["comma"] = "comma", ["debug"] = "debug", ["disp"] = "disp", ["frac"] = "frac", ["input"] = "input", ["lang"] = "lang", ["link"] = "lk", ["lk"] = "lk", ["order"] = "order", ["qid"] = "qid", ["qual"] = "qual", ["qualifier"] = "qual", ["round"] = "round", ["sigfig"] = "sigfig", ["sing"] = "adj", -- "sing" is an old alias for "adj" ["sortable"] = "sortable", ["sp"] = "sp", ["spell"] = "spell", ["stylein"] = "stylein", ["styleout"] = "styleout", ["tracking"] = "tracking", } -- Valid option values. -- Convention: parms.opt_xxx refers to an option that is set here -- (not intended to be set by the template which invokes this module). -- Example: At enwiki, "abbr" includes: -- ["values"] = "opt_values" -- As a result, if the template uses abbr=values, Module:Convert sets: -- parms["opt_values"] = true -- parms["abbr"] = nil -- Therefore parms.abbr will be nil, or will have one of the listed values -- that do not start with "opt_". -- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated. -- Options removed in January 2018 with remnants still in Module:Convert: -- abbr=mos (in a range, repeat the input unit) -- adj=1 (set opt_singular to make the unit name singular when 0 < abs(value) <= 1) local en_option_value = { ["$"] = 'TEXT', -- TEXT should be a currency symbol that will be used instead of "$" ["abbr"] = { -- ["local text for option value"] = "en value used in this module" ["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation") ["h"] = "on", -- abbr=on + use "h" for hand unit (default) ["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit ["in"] = "in", -- use symbol for LHS unit ["none"] = "off", -- old name for "off" ["off"] = "off", -- use name for all units ["on"] = "on", -- use symbol for all units ["out"] = "out", -- use symbol for RHS unit (default) ["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km) ["values"] = "opt_values", -- show only input and output numbers, not units ["~"] = "opt_also_symbol", -- show input unit symbol as well as name }, ["adj"] = { ["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output) ["off"] = "", -- ignored (off is the default) ["on"] = "opt_adjectival", -- unit name is singular and hyphenated ["pre"] = "opt_one_preunit", -- user-specified text before input unit ["ri0"] = "opt_ri=0", -- round input with precision = 0 ["ri1"] = "opt_ri=1", -- round input with precision = 1 ["ri2"] = "opt_ri=2", -- round input with precision = 2 ["ri3"] = "opt_ri=3", -- round input with precision = 3 ["~"] = "opt_also_symbol", -- same as abbr=~ so can have {{convert|1|C|K|abbr=off|adj=~}} }, ["altitude_ft"] = 'INTEGER', ["altitude_m"] = 'INTEGER', ["comma"] = { ["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits ["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits ["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark ["off"] = "opt_nocomma", -- no numsep in input or output numbers }, ["debug"] = { ["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible }, ["disp"] = { ["5"] = "opt_round=5?", -- round output value to nearest 5 ["b"] = "b", -- join: '(...)' ["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination ["br"] = "br", -- join: '<br />' ["br()"] = "br()", -- join: '<br />(...)' ["comma"] = "comma", -- join: ',' ["flip"] = "opt_flip", -- reverse order of input/output ["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name) ["or"] = "or", -- join: 'or' ["out"] = "opt_output_only", ["output number only"] = "opt_output_number_only", ["output only"] = "opt_output_only", ["preunit"] = "opt_two_preunits", -- user-specified text before input and output units ["semicolon"] = "semicolon", -- join: ';' ["sqbr"] = "sqbr", -- join: '[...]' ["table"] = "opt_table", -- output is suitable for a table cell with align="right" ["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center" ["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value) ["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known ["unit2"] = "opt_output_unit_only", ["x"] = "x", -- join: <first>...<second> (user-specified text) }, ["frac"] = 'INTEGER', ["input"] = 'TEXT', -- TEXT should be <value><space><unitcode> or <wikidata-property-id> ["lang"] = { -- language for output digits (both en and local digits are always accepted for input) ["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language ["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en) }, ["lk"] = { ["in"] = "in", -- link LHS unit name or symbol ["off"] = "off", -- do not link: same as default except for hand unit ["on"] = "on", -- link all unit names or symbols (but not twice for the same unit) ["out"] = "out", -- link RHS unit name or symbol }, ["order"] = { ["flip"] = "opt_flip", -- reverse order of input/output ["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input }, ["qid"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier ["qual"] = 'TEXT', -- TEXT should be a Wikidata Q item identifier ["round"] = { ["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5 ["5"] = "opt_round=5", -- round output value to nearest 5 ["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1") ["25"] = "opt_round=25", -- round output value to nearest 25 ["50"] = "opt_round=50", -- round output value to nearest 50 ["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range) }, ["sigfig"] = 'INTEGER', ["sortable"] = { ["off"] = "", -- ignored (off is the default) ["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit ["debug"] = "opt_sortable_on, opt_sortable_debug", -- |sortable=debug is the same as |sortable=on|debug=yes }, ["sp"] = { ["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre") }, ["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions ["in"] = "opt_spell_in", -- spell input value in words ["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase ["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words ["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase ["us"] = "opt_sp_us", -- use U.S. spelling; same as sp=us so spell=us also works }, ["stylein"] = 'TEXT', ["styleout"] = 'TEXT', ["tracking"] = 'TEXT', } local titles = { ["frac"] = "Fraction/styles.css", ["sfrac"] = "Sfrac/styles.css", } return { SIprefixes = SIprefixes, all_categories = all_categories, all_messages = all_messages, currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true }, customary_units = customary_units, disp_joins = disp_joins, en_option_name = en_option_name, en_option_value = en_option_value, eng_scales = eng_scales, ranges = ranges, titles = titles, } d9f24f7b3c125178aa827b8e2b4ad1e7ba143f48 Module:Convert/wikidata 828 723 1110 1109 2025-08-22T00:55:51Z Sharparam 284703 1 revision imported Scribunto text/plain -- Functions to access Wikidata for Module:Convert. local Collection = {} Collection.__index = Collection do function Collection:add(item) if item ~= nil then self.n = self.n + 1 self[self.n] = item end end function Collection:join(sep) return table.concat(self, sep) end function Collection:remove(pos) if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then self.n = self.n - 1 return table.remove(self, pos) end end function Collection:sort(comp) table.sort(self, comp) end function Collection.new() return setmetatable({n = 0}, Collection) end end local function strip_to_nil(text) -- If text is a non-empty string, return its trimmed content, -- otherwise return nothing (empty string or not a string). if type(text) == 'string' then return text:match('(%S.-)%s*$') end end local function frequency_unit(value, unit_table) -- For use when converting m to Hz. -- Return true, s where s = name of unit's default output unit, -- or return false, t where t is an error message table. -- However, for simplicity a valid result is always returned. local unit if unit_table._symbol == 'm' then -- c = speed of light in a vacuum = 299792458 m/s -- frequency = c / wavelength local w = value * (unit_table.scale or 1) local f = 299792458 / w -- if w == 0, f = math.huge which works here if f >= 1e12 then unit = 'THz' elseif f >= 1e9 then unit = 'GHz' elseif f >= 1e6 then unit = 'MHz' elseif f >= 1e3 then unit = 'kHz' else unit = 'Hz' end end return true, unit or 'Hz' end local function wavelength_unit(value, unit_table) -- Like frequency_unit but for use when converting Hz to m. local unit if unit_table._symbol == 'Hz' then -- Using 0.9993 rather than 1 avoids rounding which would give results -- like converting 300 MHz to 100 cm instead of 1 m. local w = 1 / (value * (unit_table.scale or 1)) -- Hz scale is inverted if w >= 0.9993e6 then unit = 'Mm' elseif w >= 0.9993e3 then unit = 'km' elseif w >= 0.9993 then unit = 'm' elseif w >= 0.9993e-2 then unit = 'cm' elseif w >= 0.9993e-3 then unit = 'mm' else unit = 'um' end end return true, unit or 'm' end local specials = { frequency = { frequency_unit }, wavelength = { wavelength_unit }, -------------------------------------------------------------------------------- -- Following is a removed experiment to show two values as a range -- using '-' as the separator. -- frequencyrange = { frequency_unit, '-' }, -- wavelengthrange = { wavelength_unit, '-' }, } local function make_unit(units, parms, uid) -- Return a unit code for convert or nil if unit unknown. -- If necessary, add a dummy unit to parms so convert will use it -- for the input without attempting a conversion since nothing -- useful is available (for example, with unit volt). local unit = units[uid] if type(unit) ~= 'table' then return nil end local ucode = unit.ucode if ucode and not unit.si then return ucode -- a unit known to convert end parms.opt_ignore_error = true ucode = ucode or unit._ucode -- must be a non-empty string local ukey, utable if unit.si then local base = units[unit.si] ukey = base.symbol -- must be a non-empty string local n1 = base.name1 local n2 = base.name2 if not n1 then n1 = ukey n2 = n2 or n1 -- do not append 's' end utable = { _symbol = ukey, _name1 = n1, _name2 = n2, link = unit.link or base.link, utype = n1, prefixes = 1, } else ukey = ucode utable = { symbol = ucode, -- must be a non-empty string name1 = unit.name1, -- if nil, uses symbol name2 = unit.name2, -- if nil, uses name1..'s' link = unit.link, -- if nil, uses name1 utype = unit.name1 or ucode, } end utable.scale = 1 utable.default = '' utable.defkey = '' utable.linkey = '' utable.bad_mcode = '' parms.unittable = { [ukey] = utable } return ucode end local function matches_qualifier(statement, qual) -- Return: -- false, nil : if statement does not match specification -- true, nil : if matches, and statement has no qualifier -- true, sq : if matches, where sq is the statement's qualifier -- A match means that no qualifier was specified (qual == nil), or that -- the statement has a qualifier matching the specification. -- If a match occurs, the caller needs the statement's qualifier (if any) -- so statements that duplicate the qualifier are not used, after the first. -- Then, if convert is showing all values for a property such as the diameter -- of a telescope's mirror (diameters of primary and secondary mirrors), it -- will not show alternative values that could in principle be present for the -- same item (telescope) and property (diameter) and qualifier (primary/secondary). local target = (statement.qualifiers or {}).P518 -- P518 is "applies to part" if type(target) == 'table' then for _, q in ipairs(target) do if type(q) == 'table' then local value = (q.datavalue or {}).value if value then if qual == nil or qual == value.id then return true, value.id end end end end end if qual == nil then return true, nil -- only occurs if statement has no qualifier end return false, nil -- statement's qualifier is not relevant because statement will be skipped end local function get_statements(parms, pid) -- Get specified item and return a list of tables with each statement for property pid. -- Each table is of form {statqual=sq, stmt=statement} where sq = statement qualifier (nil if none). -- Statements are in Wikidata's order except that those with preferred rank -- are first, then normal rank. Any other rank is ignored. local stored = {} -- qualifiers of statements that are first for the qualifier, and will be returned local qid = strip_to_nil(parms.qid) -- nil for current page's item, or an item id (expensive) local qual = strip_to_nil(parms.qual) -- nil or id of wanted P518 (applies to part) item in qualifiers local result = Collection.new() local entity = mw.wikibase.getEntity(qid) if type(entity) == 'table' then local statements = (entity.claims or {})[pid] if type(statements) == 'table' then for _, rank in ipairs({ 'preferred', 'normal' }) do for _, statement in ipairs(statements) do if type(statement) == 'table' and rank == statement.rank then local is_match, statqual = matches_qualifier(statement, qual) if is_match then result:add({ statqual = statqual, stmt = statement }) end end end end end end return result end local function input_from_property(tdata, parms, pid) -- Given that pid is a Wikidata property identifier like 'P123', -- return a collection of {amount, ucode} pairs (two strings) -- for each matching item/property, or return nothing. -------------------------------------------------------------------------------- -- There appear to be few restrictions on how Wikidata is organized so it is -- very likely that any decision a module makes about how to handle data -- will be wrong for some cases at some time. This meets current requirements. -- For each qualifier (or if no qualifier), if there are any preferred -- statements, use them and ignore any normal statements. -- For each qualifier, for the preferred statements if any, or for -- the normal statements (but not both): -- * Accept each statement if it has no qualifier (this will not occur -- if qual=x is specified because other code already ensures that in that -- case, only statements with a qualifier matching x are considered). -- * Ignore any statements after the first if it has a qualifier. -- The rationale is that for the diameter at [[South Pole Telescope]], want -- convert to show the diameters for both the primary and secondary mirrors -- if the convert does not specify which diameter is wanted. -- However, if convert is given the wanted qualifier, only one value -- (_the_ diameter) is wanted. For simplicity/consistency, that is also done -- even if no qual=x is specified. Unclear what should happen. -- For the wavelength at [[Nançay Radio Telescope]], want to show all three -- values, and the values have no qualifiers. -------------------------------------------------------------------------------- local result = Collection.new() local done = {} local skip_normal for _, t in ipairs(get_statements(parms, pid)) do local statement = t.stmt if statement.mainsnak and statement.mainsnak.datatype == 'quantity' then local value = (statement.mainsnak.datavalue or {}).value if value then local amount = value.amount if amount then amount = tostring(amount) -- in case amount is ever a number if amount:sub(1, 1) == '+' then amount = amount:sub(2) end local unit = value.unit if type(unit) == 'string' then unit = unit:match('Q%d+$') -- unit item id is at end of URL local ucode = make_unit(tdata.wikidata_units, parms, unit) if ucode then local skip if t.statqual then if done[t.statqual] then skip = true else done[t.statqual] = true end else if statement.rank == 'preferred' then skip_normal = true elseif skip_normal then skip = true end end if not skip then result:add({ amount, ucode }) end end end end end end end return result end local function input_from_text(tdata, parms, text, insert2) -- Given string should be of form "<value><space><unit>" or -- "<value1><space>ft<space><value2><space>in" for a special case (feet and inches). -- Return true if values/units were extracted and inserted, or return nothing. text = text:gsub('&nbsp;', ' '):gsub('%s+', ' ') local pos = text:find(' ', 1, true) if pos then -- Leave checking of value to convert which can handle fractions. local value = text:sub(1, pos - 1) local uid = text:sub(pos + 1) if uid:sub(1, 3) == 'ft ' and uid:sub(-3) == ' in' then -- Special case for enwiki to allow {{convert|input=5 ft 10+1/2 in}} insert2(uid:sub(4, -4), 'in') insert2(value, 'ft') else insert2(value, make_unit(tdata.wikidata_units, parms, uid) or uid) end return true end end local function adjustparameters(tdata, parms, index) -- For Module:Convert, adjust parms (a table of {{convert}} parameters). -- Return true if successful or return false, t where t is an error message table. -- This is intended mainly for use in infoboxes where the input might be -- <value><space><unit> or -- <wikidata-property-id> -- If successful, insert values and units in parms, before given index. local text = parms.input -- should be a trimmed, non-empty string local pid = text:match('^P%d+$') local sep = ',' local special = specials[parms[index]] if special then parms.out_unit = special[1] sep = special[2] or sep table.remove(parms, index) end local function quit() return false, pid and { 'cvt_no_output' } or { 'cvt_bad_input', text } end local function insert2(first, second) table.insert(parms, index, second) table.insert(parms, index, first) end if pid then parms.input_text = '' -- output an empty string if an error occurs local result = input_from_property(tdata, parms, pid) if result.n == 0 then return quit() end local ucode for i, t in ipairs(result) do -- Convert requires each input unit to be identical. if i == 1 then ucode = t[2] elseif ucode ~= t[2] then return quit() end end local item = ucode if item == parms[index] then -- Remove specified output unit if it is the same as the Wikidata unit. -- For example, {{convert|input=P2044|km}} with property "12 km". table.remove(parms, index) end for i = result.n, 1, -1 do insert2(result[i][1], item) item = sep end return true else if input_from_text(tdata, parms, text, insert2) then return true end end return quit() end -------------------------------------------------------------------------------- --- List units and check syntax of definitions --------------------------------- -------------------------------------------------------------------------------- local specifications = { -- seq = sequence in which fields are displayed base = { title = 'SI base units', fields = { symbol = { seq = 2, mandatory = true }, name1 = { seq = 3, mandatory = true }, name2 = { seq = 4 }, link = { seq = 5 }, }, noteseq = 6, header = '{| class="wikitable"\n!si !!symbol !!name1 !!name2 !!link !!note', item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s', footer = '|}', }, alias = { title = 'Aliases for convert', fields = { ucode = { seq = 2, mandatory = true }, si = { seq = 3 }, }, noteseq = 4, header = '{| class="wikitable"\n!alias !!ucode !!base !!note', item = '|-\n|%s ||%s ||%s ||%s', footer = '|}', }, known = { title = 'Units known to convert', fields = { ucode = { seq = 2, mandatory = true }, label = { seq = 3, mandatory = true }, }, noteseq = 4, header = '{| class="wikitable"\n!qid !!ucode !!label !!note', item = '|-\n|%s ||%s ||%s ||%s', footer = '|}', }, unknown = { title = 'Units not known to convert', fields = { _ucode = { seq = 2, mandatory = true }, si = { seq = 3 }, name1 = { seq = 4 }, name2 = { seq = 5 }, link = { seq = 6 }, label = { seq = 7, mandatory = true }, }, noteseq = 8, header = '{| class="wikitable"\n!qid !!_ucode !!base !!name1 !!name2 !!link !!label !!note', item = '|-\n|%s ||%s ||%s ||%s ||%s ||%s ||%s ||%s', footer = '|}', }, } local function listunits(tdata, ulookup) -- For Module:Convert, make wikitext to list the built-in Wikidata units. -- Return true, wikitext if successful or return false, t where t is an -- error message table. Currently, an error return never occurs. -- The syntax of each unit definition is checked and a note is added if -- a problem is detected. local function safe_cells(t) -- This is not currently needed, but in case definitions ever use wikitext -- like '[[kilogram|kg]]', escape the text so it works in a table cell. local result = {} for i, v in ipairs(t) do if v:find('|', 1, true) then v = v:gsub('(%[%[[^%[%]]-)|(.-%]%])', '%1\0%2') -- replace pipe in piped link with a zero byte v = v:gsub('|', '&#124;') -- escape '|' v = v:gsub('%z', '|') -- restore pipe in piped link end result[i] = v:gsub('{', '&#123;') -- escape '{' end return unpack(result) end local wdunits = tdata.wikidata_units local speckeys = { 'base', 'alias', 'unknown', 'known' } for _, sid in ipairs(speckeys) do specifications[sid].units = Collection.new() end local keys = Collection.new() for k, v in pairs(wdunits) do keys:add(k) end table.sort(keys) local note_count = 0 for _, key in ipairs(keys) do local unit = wdunits[key] local ktext, sid if key:match('^Q%d+$') then ktext = '[[d:' .. key .. '|' .. key .. ']]' if unit.ucode then sid = 'known' else sid = 'unknown' end elseif unit.ucode then ktext = key sid = 'alias' else ktext = key sid = 'base' end local result = { ktext } local spec = specifications[sid] local fields = spec.fields local note = Collection.new() for k, v in pairs(unit) do if fields[k] then local seq = fields[k].seq if result[seq] then note:add('duplicate ' .. k) -- cannot happen since keys are unique else result[seq] = v end else note:add('invalid ' .. k) end end for k, v in pairs(fields) do local value = result[v.seq] if value then if k == 'si' and not wdunits[value] then note:add('need si ' .. value) end if k == 'label' then local wdl = mw.wikibase.getLabel(key) if wdl ~= value then note:add('label changed to ' .. tostring(wdl)) end end else result[v.seq] = '' if v.mandatory then note:add('missing ' .. k) end end end local text if note.n > 0 then note_count = note_count + 1 text = '*' .. note:join('<br />') end result[spec.noteseq] = text or '' spec.units:add(result) end local results = Collection.new() if note_count > 0 then local text = note_count .. (note_count == 1 and ' note' or ' notes') results:add("'''Search for * to see " .. text .. "'''\n") end for _, sid in ipairs(speckeys) do local spec = specifications[sid] results:add("'''" .. spec.title .. "'''") results:add(spec.header) local fmt = spec.item for _, unit in ipairs(spec.units) do results:add(string.format(fmt, safe_cells(unit))) end results:add(spec.footer) end return true, results:join('\n') end return { _adjustparameters = adjustparameters, _listunits = listunits } b93954acaa7b2c734c1c6f4c869ed6d1821a2d84 Module:Convert/wikidata/data 828 724 1112 1111 2025-08-22T00:55:51Z Sharparam 284703 1 revision imported Scribunto text/plain --[[ Cache of Wikidata information with units for Module:Convert. The codes should rarely change, and using a cache means that changing a unit at Wikidata will not cause lots of converts in articles to break. For a unit known to convert, the unit here must have: label = Wikidata label for unit (used only when listing units) ucode = unit code for input to convert (there are no optional fields because convert handles everything) For a unit not known to convert, the unit here must have: label = Wikidata label for unit (used only when listing units) (no ucode field) _ucode = unit code for input to convert, and the symbol used to display the unit when abbr=on (convert will use the specified fields to display the unit, and will not attempt to do a conversion) For a unit not known to convert, the unit here may have: name1 = singular name used to display the unit when abbr=off name2 = plural name used to display the unit when abbr=off link = name of article that unit will be linked to when lk=on si = key for the SI base unit, if any The base unit for each SI unit here must have: symbol = symbol used to display the base unit when abbr=on name1 = singular name of base unit used to display the unit when abbr=off (if name1 is not given, symbol will be used, but an SI unit should have a name) The base unit for each SI unit here may have: name2 = plural name of base unit used to display the unit when abbr=off link = name of article that unit will be linked to when lk=on (applies for all SI units using this base, where the SI unit does not define its own link field) If name1 is not specified, the symbol is used for the name. If name2 is not specified, a plural name is formed by appending 's' to name1. If link is not specified, name1 is used for the link. SI units are assumed to be simple items like V (volt) where 'mV' would cause convert to insert: 'm' before the base symbol 'V' to make 'mV', if abbr=on 'milli' before the base name 'volt' to make 'millivolt', if abbr=off A unit like "square meter" would not work because it needs an SI prefix inserted before "meter" rather than at the beginning of the name. Items that should not be used with convert as no precise unit is implied: Q11247037 ton generic (cannot use) Q178413 gallon generic Q130964 calorie dubious (ambiguous, should not use) Q216658 bushel dubious Q420266 fluid ounce dubious ]] local wikidata_units = { -- Following are SI base units. A = { symbol = 'A', name1 = 'ampere', }, F = { symbol = 'F', name1 = 'faraday', }, H = { symbol = 'H', name1 = 'henry', }, V = { symbol = 'V', name1 = 'volt', }, -- Following are aliases to convert unit codes, used with "input=<value><space><unit>". kilograms = { ucode = 'kg', }, -- Following are SI units not known to convert, used with "input=<value><space><unit>". kV = { ucode = 'kV', si = 'V', }, mV = { ucode = 'mV', si = 'V', }, -- Following are Wikidata units. Q131255 = { label = 'farad', _ucode = 'F', si = 'F', }, Q163354 = { label = 'henry', _ucode = 'H', si = 'H', }, Q1916026 = { label = 'microvolt', _ucode = 'uV', si = 'V', }, Q193933 = { label = 'dioptre', name1 = 'dioptre', _ucode = 'dpt', }, Q212120 = { label = 'ampere hour', name1 = 'ampere hour', _ucode = 'A⋅h', }, Q2448803 = { label = 'millivolt', _ucode = 'mV', si = 'V', }, Q2451296 = { label = 'microfarad', _ucode = 'uF', si = 'F', }, Q2490574 = { label = 'milliampere', _ucode = 'mA', si = 'A', }, Q25250 = { label = 'volt', _ucode = 'V', si = 'V', }, Q25272 = { label = 'ampere', _ucode = 'A', si = 'A', }, Q2553708 = { label = 'megavolt', _ucode = 'MV', si = 'V', }, Q2554092 = { label = 'kilovolt', _ucode = 'kV', si = 'V', }, Q2636421 = { label = 'nanohenry', _ucode = 'nH', si = 'H', }, Q2679083 = { label = 'microhenry', _ucode = 'uH', si = 'H', }, Q2682463 = { label = 'nanofarad', _ucode = 'nF', si = 'F', }, Q2756030 = { label = 'picofarad', _ucode = 'pF', si = 'F', }, Q2793566 = { label = 'gigavolt', _ucode = 'GV', si = 'V', }, Q2924137 = { label = 'millihenry', _ucode = 'mH', si = 'H', }, Q3117809 = { label = 'microampere', _ucode = 'uA', si = 'A', }, Q33680 = { label = 'radian', name1 = 'radian', _ucode = 'rad', }, Q4456994 = { label = 'millifarad', _ucode = 'mF', si = 'F', }, Q47083 = { label = 'ohm', name1 = 'ohm', _ucode = 'Ω', }, Q483261 = { label = 'dalton', name1 = 'dalton', _ucode = 'u', }, Q550341 = { label = 'volt-ampere', name1 = 'volt-ampere', _ucode = 'VA', }, Q100995 = { label = 'pound', ucode = 'lb', }, Q1022113 = { label = 'cubic centimetre', ucode = 'cc', }, Q102573 = { label = 'becquerel', ucode = 'Bq', }, Q103246 = { label = 'sievert', ucode = 'Sv', }, Q1050958 = { label = 'inch of mercury', ucode = 'inHg', }, Q1051665 = { label = 'metre per second squared', ucode = 'm/s2', }, Q1052397 = { label = 'rad', ucode = 'rad', }, Q1054140 = { label = 'megametre', ucode = 'Mm', }, Q1057069 = { label = 'hectogram', ucode = 'hg', }, Q1063786 = { label = 'square inch', ucode = 'sqin', }, Q1092296 = { label = 'annum', ucode = 'year', }, Q11570 = { label = 'kilogram', ucode = 'kg', }, Q11573 = { label = 'metre', ucode = 'm', }, Q11574 = { label = 'second', ucode = 's', }, Q11579 = { label = 'kelvin', ucode = 'K', }, Q11582 = { label = 'litre', ucode = 'litre', }, Q1165588 = { label = 'rod', ucode = 'rod', }, Q1165799 = { label = 'thou', ucode = 'thou', }, Q11776930 = { label = 'megagram', ucode = 'Mg', }, Q11929860 = { label = 'kiloparsec', ucode = 'kpc', }, Q1194225 = { label = 'pound-force', ucode = 'lbf', }, Q12129 = { label = 'parsec', ucode = 'pc', }, Q12438 = { label = 'newton', ucode = 'N', }, Q1255620 = { label = 'dram', ucode = 'drachm', }, Q12874593 = { label = 'watt-hour', ucode = 'W.h', }, Q128822 = { label = 'knot', ucode = 'kn', }, Q1374438 = { label = 'kilosecond', ucode = 'ks', }, Q1377051 = { label = 'gigasecond', ucode = 'Gs', }, Q14754979 = { label = 'zettagram', ucode = 'Zg', }, Q14786969 = { label = 'megajoule', ucode = 'MJ', }, Q14787261 = { label = 'megawatt hour', ucode = 'MW.h', }, Q1550511 = { label = 'square yard', ucode = 'sqyd', }, Q160857 = { label = 'metric horsepower', ucode = 'hp', }, Q1628990 = { label = 'horsepower-hour', ucode = 'hph', }, Q163343 = { label = 'tesla', ucode = 'T', }, Q1645498 = { label = 'microgram', ucode = 'ug', }, Q17087835 = { label = 'cuerda', ucode = 'cda', }, Q174728 = { label = 'centimetre', ucode = 'cm', }, Q174789 = { label = 'millimetre', ucode = 'mm', }, Q175821 = { label = 'micrometre', ucode = 'um', }, Q1770733 = { label = 'teragram', ucode = 'Tg', }, Q1772386 = { label = 'decigram', ucode = 'dg', }, Q177493 = { label = 'gauss', ucode = 'G', }, Q1777507 = { label = 'femtosecond', ucode = 'fs', }, Q177974 = { label = 'standard atmosphere', ucode = 'atm', }, Q178674 = { label = 'nanometre', ucode = 'nm', }, Q180154 = { label = 'kilometre per hour', ucode = 'km/h', }, Q180892 = { label = 'solar mass', ucode = 'solar mass', }, Q1811 = { label = 'astronomical unit', ucode = 'au', }, Q1815100 = { label = 'centilitre', ucode = 'cl', }, Q182098 = { label = 'kilowatt hour', ucode = 'kW.h', }, Q1823150 = { label = 'microwatt', ucode = 'uW', }, Q182429 = { label = 'metre per second', ucode = 'm/s', }, Q1826195 = { label = 'decilitre', ucode = 'dl', }, Q185078 = { label = 'are', ucode = 'a', }, Q185153 = { label = 'erg', ucode = 'erg', }, Q185648 = { label = 'torr', ucode = 'Torr', }, Q190095 = { label = 'gray', ucode = 'Gy', }, Q191118 = { label = 'tonne', ucode = 'tonne', }, Q1913097 = { label = 'femtogram', ucode = 'fg', }, Q192274 = { label = 'picometre', ucode = 'pm', }, Q1972579 = { label = 'poundal', ucode = 'pdl', }, Q200323 = { label = 'decimetre', ucode = 'dm', }, Q201933 = { label = 'dyne', ucode = 'dyn', }, Q2029519 = { label = 'hectolitre', ucode = 'hl', }, Q2051195 = { label = 'gigawatt hour', ucode = 'GW.h', }, Q207488 = { label = 'Rankine scale', ucode = 'R', }, Q208788 = { label = 'femtometre', ucode = 'fm', }, Q2101 = { label = 'elementary charge', ucode = 'e', }, Q21014455 = { label = 'metre per minute', ucode = 'm/min', }, Q21062777 = { label = 'megapascal', ucode = 'MPa', }, Q21064807 = { label = 'kilopascal', ucode = 'kPa', }, Q211256 = { label = 'mile per hour', ucode = 'mph', }, Q21178489 = { label = 'barrels per day', ucode = 'oilbbl/d', }, Q2143992 = { label = 'kilohertz', ucode = 'kHz', }, Q21467992 = { label = 'cubic foot per second', ucode = 'cuft/s', }, Q215571 = { label = 'newton metre', ucode = 'Nm', }, Q216795 = { label = 'dunam', ucode = 'dunam', }, Q216880 = { label = 'kilogram-force', ucode = 'kgf', }, Q18413919 = { label = 'centimetre per second', ucode = 'cm/s', }, Q218593 = { label = 'inch', ucode = 'in', }, Q2282891 = { label = 'microlitre', ucode = 'ul', }, Q2282906 = { label = 'nanogram', ucode = 'ng', }, Q229354 = { label = 'curie', ucode = 'Ci', }, Q232291 = { label = 'square mile', ucode = 'sqmi', }, Q2332346 = { label = 'millilitre', ucode = 'ml', }, Q23387 = { label = 'week', ucode = 'week', }, Q23823681 = { label = 'terawatt', ucode = 'TW', }, Q23925410 = { label = 'gallon (UK)', ucode = 'impgal', }, Q23925413 = { label = 'gallon (US)', ucode = 'USgal', }, Q2438073 = { label = 'attogram', ucode = 'ag', }, Q2474258 = { label = 'millisievert', ucode = 'mSv', }, Q2483628 = { label = 'attosecond', ucode = 'as', }, Q2489298 = { label = 'square centimetre', ucode = 'cm2', }, Q2518569 = { label = 'nanosievert', ucode = 'nSv', }, Q25235 = { label = 'hour', ucode = 'h', }, Q25236 = { label = 'watt', ucode = 'W', }, Q25267 = { label = 'degree Celsius', ucode = 'C', }, Q25269 = { label = 'joule', ucode = 'J', }, Q253276 = { label = 'mile', ucode = 'mi', }, Q25343 = { label = 'square metre', ucode = 'm2', }, Q25406 = { label = 'coulomb', ucode = 'coulomb', }, Q25517 = { label = 'cubic metre', ucode = 'm3', }, Q260126 = { label = 'Roentgen equivalent man', ucode = 'rem', }, Q2612219 = { label = 'petagram', ucode = 'Pg', }, Q2619500 = { label = 'foe', ucode = 'foe', }, Q2637946 = { label = 'decalitre', ucode = 'dal', }, Q2655272 = { label = 'exagram', ucode = 'Eg', }, Q2691798 = { label = 'centigram', ucode = 'cg', }, Q2739114 = { label = 'microsievert', ucode = 'uSv', }, Q2799294 = { label = 'gigagram', ucode = 'Gg', }, Q3013059 = { label = 'kiloannum', ucode = 'millennium', }, Q305896 = { label = 'dots per inch', ucode = 'dpi', }, Q3207456 = { label = 'milliwatt', ucode = 'mW', }, Q3221356 = { label = 'yoctometre', ucode = 'ym', }, Q3239557 = { label = 'picogram', ucode = 'pg', }, Q3241121 = { label = 'milligram', ucode = 'mg', }, Q3267417 = { label = 'terametre', ucode = 'Tm', }, Q3270676 = { label = 'zeptometre', ucode = 'zm', }, Q3276763 = { label = 'gigahertz', ucode = 'GHz', }, Q3277907 = { label = 'exametre', ucode = 'Em', }, Q3277915 = { label = 'zettametre', ucode = 'Zm', }, Q3277919 = { label = 'petametre', ucode = 'Pm', }, Q3312063 = { label = 'femtolitre', ucode = 'fl', }, Q3320608 = { label = 'kilowatt', ucode = 'kW', }, Q3332822 = { label = 'megaton of TNT', ucode = 'Mt(TNT)', }, Q35852 = { label = 'hectare', ucode = 'ha', }, Q3675550 = { label = 'cubic millimetre', ucode = 'mm3', }, Q3710 = { label = 'foot', ucode = 'ft', }, Q3773454 = { label = 'megaparsec', ucode = 'Mpc', }, Q3902688 = { label = 'picolitre', ucode = 'pl', }, Q3902709 = { label = 'picosecond', ucode = 'ps', }, Q39369 = { label = 'hertz', ucode = 'Hz', }, Q3972226 = { label = 'kilolitre', ucode = 'kl', }, Q4068266 = { label = "apothecaries' drachm", ucode = 'drachm', }, Q41803 = { label = 'gram', ucode = 'g', }, Q4220561 = { label = 'kilometre per second', ucode = 'km/s', }, Q42289 = { label = 'degree Fahrenheit', ucode = 'F', }, Q4243638 = { label = 'cubic kilometre', ucode = 'km3', }, Q44395 = { label = 'pascal', ucode = 'Pa', }, Q48013 = { label = 'ounce', ucode = 'oz', }, Q482798 = { label = 'yard', ucode = 'yd', }, Q4989854 = { label = 'kilojoule', ucode = 'kJ', }, Q4992853 = { label = 'kiloton of TNT', ucode = 'kt(TNT)', }, Q5139563 = { label = 'hectopascal', ucode = 'hPa', }, Q5151 = { label = 'month', ucode = 'month', }, Q531 = { label = 'light-year', ucode = 'ly', }, Q5465723 = { label = 'foot-poundal', ucode = 'ftpdl', }, Q573 = { label = 'day', ucode = 'd', }, Q577 = { label = 'year', ucode = 'year', }, Q5879479 = { label = 'gigawatt', ucode = 'GW', }, Q6003257 = { label = 'attometre', ucode = 'am', }, Q613726 = { label = 'yottagram', ucode = 'Yg', }, Q6170164 = { label = 'yoctogram', ucode = 'yg', }, Q667419 = { label = 'long ton', ucode = 'LT', }, Q673166 = { label = 'gravity of Earth', ucode = 'g0', }, Q693944 = { label = 'grain', ucode = 'gr', }, Q6982035 = { label = 'megawatt', ucode = 'MW', }, Q712226 = { label = 'square kilometre', ucode = 'km2', }, Q723733 = { label = 'millisecond', ucode = 'ms', }, Q732454 = { label = 'megaannum', ucode = 'Myr', }, Q732707 = { label = 'megahertz', ucode = 'MHz', }, Q752079 = { label = 'gross register ton', ucode = 'grt', }, Q752197 = { label = 'kilojoule per mole', ucode = 'kJ/mol', }, Q7727 = { label = 'minute', ucode = 'min', }, Q794261 = { label = 'cubic metre per second', ucode = 'm3/s', }, Q809678 = { label = 'barye', ucode = 'Ba', }, Q81292 = { label = 'acre', ucode = 'acre', }, Q81454 = { label = 'ångström', ucode = 'angstrom', }, Q828224 = { label = 'kilometre', ucode = 'km', }, Q83327 = { label = 'electronvolt', ucode = 'eV', }, Q838801 = { label = 'nanosecond', ucode = 'ns', }, Q842015 = { label = 'microsecond', ucode = 'us', }, Q844211 = { label = 'kilogram per cubic metre', ucode = 'kg/m3', }, Q844338 = { label = 'hectometre', ucode = 'hm', }, Q844976 = { label = 'oersted', ucode = 'Oe', }, Q848856 = { label = 'decametre', ucode = 'dam', }, Q854546 = { label = 'gigametre', ucode = 'Gm', }, Q857027 = { label = 'square foot', ucode = 'sqft', }, Q9048643 = { label = 'nanolitre', ucode = 'nl', }, Q93318 = { label = 'nautical mile', ucode = 'nmi', }, } return { wikidata_units = wikidata_units } 780312bf04e64ca1dd5fb2b59dc26b420a30ab56 Module:Convert/extra 828 725 1114 1113 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported Scribunto text/plain -- Extra conversion data used by Module:Convert. -- -- [[Module:Convert/data]] defines all units and is transcluded in all pages -- where [[Module:Convert]] is used. Testing new units by editing that module -- would invalidate the cache for all affected pages. -- -- For quick changes and experiments with new units, this module can be edited. -- Since this module is transcluded in only a small number of pages, changes -- should cause little server overhead and should propagate quickly. -- -- If a unit is defined in the data module, any definition here is ignored, -- so defining the same unit in both modules is not an error. -- A unit defined here can refer to units that are also defined here, and -- can refer to units defined in the data module. -- -- Periodically, those extra units that are wanted permanently can be removed -- from here after being added to [[Module:Convert/data]]. local extra_units = { ["bit"] = { _name1 = "bit", _symbol = "bit", utype = "information", scale = 0.125, prefixes = 1, default = "B", link = "Bit", }, ["per-km2"] = { name1 = "per square kilometre", name1_us = "per square kilometer", name2 = "per square kilometre", name2_us = "per square kilometer", symbol = "per&nbsp;km<sup>2</sup>", utype = "per unit area", scale = 1e-6, default = "/sqmi", link = "Square kilometre", }, } return { extra_units = extra_units } 55a4ac716545a8687a16e661345c64dca7597848 Module:ConvertNumeric 828 726 1116 1115 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported Scribunto text/plain -- Module for converting between different representations of numbers. See talk page for user documentation. -- For unit tests see: [[Module:ConvertNumeric/testcases]] -- When editing, preview with: [[Module_talk:ConvertNumeric/testcases]] -- First, edit [[Module:ConvertNumeric/sandbox]], then preview with [[Module_talk:ConvertNumeric/sandbox/testcases]] require('strict') local ones_position = { [0] = 'zero', [1] = 'one', [2] = 'two', [3] = 'three', [4] = 'four', [5] = 'five', [6] = 'six', [7] = 'seven', [8] = 'eight', [9] = 'nine', [10] = 'ten', [11] = 'eleven', [12] = 'twelve', [13] = 'thirteen', [14] = 'fourteen', [15] = 'fifteen', [16] = 'sixteen', [17] = 'seventeen', [18] = 'eighteen', [19] = 'nineteen' } local ones_position_ord = { [0] = 'zeroth', [1] = 'first', [2] = 'second', [3] = 'third', [4] = 'fourth', [5] = 'fifth', [6] = 'sixth', [7] = 'seventh', [8] = 'eighth', [9] = 'ninth', [10] = 'tenth', [11] = 'eleventh', [12] = 'twelfth', [13] = 'thirteenth', [14] = 'fourteenth', [15] = 'fifteenth', [16] = 'sixteenth', [17] = 'seventeenth', [18] = 'eighteenth', [19] = 'nineteenth' } local ones_position_plural = { [0] = 'zeros', [1] = 'ones', [2] = 'twos', [3] = 'threes', [4] = 'fours', [5] = 'fives', [6] = 'sixes', [7] = 'sevens', [8] = 'eights', [9] = 'nines', [10] = 'tens', [11] = 'elevens', [12] = 'twelves', [13] = 'thirteens', [14] = 'fourteens', [15] = 'fifteens', [16] = 'sixteens', [17] = 'seventeens', [18] = 'eighteens', [19] = 'nineteens' } local tens_position = { [2] = 'twenty', [3] = 'thirty', [4] = 'forty', [5] = 'fifty', [6] = 'sixty', [7] = 'seventy', [8] = 'eighty', [9] = 'ninety' } local tens_position_ord = { [2] = 'twentieth', [3] = 'thirtieth', [4] = 'fortieth', [5] = 'fiftieth', [6] = 'sixtieth', [7] = 'seventieth', [8] = 'eightieth', [9] = 'ninetieth' } local tens_position_plural = { [2] = 'twenties', [3] = 'thirties', [4] = 'forties', [5] = 'fifties', [6] = 'sixties', [7] = 'seventies', [8] = 'eighties', [9] = 'nineties' } local groups = { [1] = 'thousand', [2] = 'million', [3] = 'billion', [4] = 'trillion', [5] = 'quadrillion', [6] = 'quintillion', [7] = 'sextillion', [8] = 'septillion', [9] = 'octillion', [10] = 'nonillion', [11] = 'decillion', [12] = 'undecillion', [13] = 'duodecillion', [14] = 'tredecillion', [15] = 'quattuordecillion', [16] = 'quindecillion', [17] = 'sexdecillion', [18] = 'septendecillion', [19] = 'octodecillion', [20] = 'novemdecillion', [21] = 'vigintillion', [22] = 'unvigintillion', [23] = 'duovigintillion', [24] = 'tresvigintillion', [25] = 'quattuorvigintillion', [26] = 'quinquavigintillion', [27] = 'sesvigintillion', [28] = 'septemvigintillion', [29] = 'octovigintillion', [30] = 'novemvigintillion', [31] = 'trigintillion', [32] = 'untrigintillion', [33] = 'duotrigintillion', [34] = 'trestrigintillion', [35] = 'quattuortrigintillion', [36] = 'quinquatrigintillion', [37] = 'sestrigintillion', [38] = 'septentrigintillion', [39] = 'octotrigintillion', [40] = 'noventrigintillion', [41] = 'quadragintillion', [51] = 'quinquagintillion', [61] = 'sexagintillion', [71] = 'septuagintillion', [81] = 'octogintillion', [91] = 'nonagintillion', [101] = 'centillion', [102] = 'uncentillion', [103] = 'duocentillion', [104] = 'trescentillion', [111] = 'decicentillion', [112] = 'undecicentillion', [121] = 'viginticentillion', [122] = 'unviginticentillion', [131] = 'trigintacentillion', [141] = 'quadragintacentillion', [151] = 'quinquagintacentillion', [161] = 'sexagintacentillion', [171] = 'septuagintacentillion', [181] = 'octogintacentillion', [191] = 'nonagintacentillion', [201] = 'ducentillion', [301] = 'trecentillion', [401] = 'quadringentillion', [501] = 'quingentillion', [601] = 'sescentillion', [701] = 'septingentillion', [801] = 'octingentillion', [901] = 'nongentillion', [1001] = 'millinillion', } local roman_numerals = { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 } local engord_tens_end = { ['twentieth'] = 20, ['thirtieth'] = 30, ['fortieth'] = 40, ['fiftieth'] = 50, ['sixtieth'] = 60, ['seventieth'] = 70, ['eightieth'] = 80, ['ninetieth'] = 90, } local eng_tens_cont = { ['twenty'] = 20, ['thirty'] = 30, ['forty'] = 40, ['fifty'] = 50, ['sixty'] = 60, ['seventy'] = 70, ['eighty'] = 80, ['ninety'] = 90, } -- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns { -1, errorstring } on error. local function roman_to_numeral(roman) if type(roman) ~= "string" then return -1, "roman numeral not a string" end local rev = roman:reverse() local raising = true local last = 0 local result = 0 for i = 1, #rev do local c = rev:sub(i, i) local next = roman_numerals[c] if next == nil then return -1, "roman numeral contains illegal character " .. c end if next > last then result = result + next raising = true elseif next < last then result = result - next raising = false elseif raising then result = result + next else result = result - next end last = next end return result end -- Converts a given integer between 0 and 100 to English text (e.g. 47 -> forty-seven). local function numeral_to_english_less_100(num, ordinal, plural, zero) local terminal_ones, terminal_tens if ordinal then terminal_ones = ones_position_ord terminal_tens = tens_position_ord elseif plural then terminal_ones = ones_position_plural terminal_tens = tens_position_plural else terminal_ones = ones_position terminal_tens = tens_position end if num == 0 and zero ~= nil then return zero elseif num < 20 then return terminal_ones[num] elseif num % 10 == 0 then return terminal_tens[num / 10] else return tens_position[math.floor(num / 10)] .. '-' .. terminal_ones[num % 10] end end local function standard_suffix(ordinal, plural) if ordinal then return 'th' end if plural then return 's' end return '' end -- Converts a given integer (in string form) between 0 and 1000 to English text (e.g. 47 -> forty-seven). local function numeral_to_english_less_1000(num, use_and, ordinal, plural, zero) num = tonumber(num) if num < 100 then return numeral_to_english_less_100(num, ordinal, plural, zero) elseif num % 100 == 0 then return ones_position[num/100] .. ' hundred' .. standard_suffix(ordinal, plural) else return ones_position[math.floor(num/100)] .. ' hundred ' .. (use_and and 'and ' or '') .. numeral_to_english_less_100(num % 100, ordinal, plural, zero) end end -- Converts an ordinal in English text from 'zeroth' to 'ninety-ninth' inclusive to a number [0–99], else -1. local function english_to_ordinal(english) local eng = string.lower(english or '') local engord_lt20 = {} -- ones_position_ord{} keys & values swapped for k, v in pairs( ones_position_ord ) do engord_lt20[v] = k end if engord_lt20[eng] then return engord_lt20[eng] -- e.g. first -> 1 elseif engord_tens_end[eng] then return engord_tens_end[eng] -- e.g. ninetieth -> 90 else local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$') if tens and ones then local tens_cont = eng_tens_cont[tens] local ones_end = engord_lt20[ones] if tens_cont and ones_end then return tens_cont + ones_end -- e.g. ninety-ninth -> 99 end end end return -1 -- Failed end -- Converts a number in English text from 'zero' to 'ninety-nine' inclusive to a number [0–99], else -1. local function english_to_numeral(english) local eng = string.lower(english or '') local eng_lt20 = { ['single'] = 1 } -- ones_position{} keys & values swapped for k, v in pairs( ones_position ) do eng_lt20[v] = k end if eng_lt20[eng] then return eng_lt20[eng] -- e.g. one -> 1 elseif eng_tens_cont[eng] then return eng_tens_cont[eng] -- e.g. ninety -> 90 else local tens, ones = string.match(eng, '^([a-z]+)[%s%-]+([a-z]+)$') if tens and ones then local tens_cont = eng_tens_cont[tens] local ones_end = eng_lt20[ones] if tens_cont and ones_end then return tens_cont + ones_end -- e.g. ninety-nine -> 99 end end end return -1 -- Failed end -- Converts a number expressed as a string in scientific notation to a string in standard decimal notation -- e.g. 1.23E5 -> 123000, 1.23E-5 = .0000123. Conversion is exact, no rounding is performed. local function scientific_notation_to_decimal(num) local exponent, subs = num:gsub("^%-?%d*%.?%d*%-?[Ee]([+%-]?%d+)$", "%1") if subs == 0 then return num end -- Input not in scientific notation, just return unmodified exponent = tonumber(exponent) local negative = num:find("^%-") local _, decimal_pos = num:find("%.") -- Mantissa will consist of all decimal digits with no decimal point local mantissa = num:gsub("^%-?(%d*)%.?(%d*)%-?[Ee][+%-]?%d+$", "%1%2") if negative and decimal_pos then decimal_pos = decimal_pos - 1 end if not decimal_pos then decimal_pos = #mantissa + 1 end -- Remove leading zeros unless decimal point is in first position while decimal_pos > 1 and mantissa:sub(1,1) == '0' do mantissa = mantissa:sub(2) decimal_pos = decimal_pos - 1 end -- Shift decimal point right for exponent > 0 while exponent > 0 do decimal_pos = decimal_pos + 1 exponent = exponent - 1 if decimal_pos > #mantissa + 1 then mantissa = mantissa .. '0' end -- Remove leading zeros unless decimal point is in first position while decimal_pos > 1 and mantissa:sub(1,1) == '0' do mantissa = mantissa:sub(2) decimal_pos = decimal_pos - 1 end end -- Shift decimal point left for exponent < 0 while exponent < 0 do if decimal_pos == 1 then mantissa = '0' .. mantissa else decimal_pos = decimal_pos - 1 end exponent = exponent + 1 end -- Insert decimal point in correct position and return return (negative and '-' or '') .. mantissa:sub(1, decimal_pos - 1) .. '.' .. mantissa:sub(decimal_pos) end -- Rounds a number to the nearest integer (NOT USED) local function round_num(x) if x%1 >= 0.5 then return math.ceil(x) else return math.floor(x) end end -- Rounds a number to the nearest two-word number (round = up, down, or "on" for round to nearest). -- Numbers with two digits before the decimal will be rounded to an integer as specified by round. -- Larger numbers will be rounded to a number with only one nonzero digit in front and all other digits zero. -- Negative sign is preserved and does not count towards word limit. local function round_for_english(num, round) -- If an integer with at most two digits, just return if num:find("^%-?%d?%d%.?$") then return num end local negative = num:find("^%-") if negative then -- We're rounding magnitude so flip it if round == 'up' then round = 'down' elseif round == 'down' then round = 'up' end end -- If at most two digits before decimal, round to integer and return local _, _, small_int, trailing_digits, round_digit = num:find("^%-?(%d?%d?)%.((%d)%d*)$") if small_int then if small_int == '' then small_int = '0' end if (round == 'up' and trailing_digits:find('[1-9]')) or (round == 'on' and tonumber(round_digit) >= 5) then small_int = tostring(tonumber(small_int) + 1) end return (negative and '-' or '') .. small_int end -- When rounding up, any number with > 1 nonzero digit will round up (e.g. 1000000.001 rounds up to 2000000) local nonzero_digits = 0 for digit in num:gfind("[1-9]") do nonzero_digits = nonzero_digits + 1 end num = num:gsub("%.%d*$", "") -- Remove decimal part -- Second digit used to determine which way to round lead digit local _, _, lead_digit, round_digit, round_digit_2, rest = num:find("^%-?(%d)(%d)(%d)(%d*)$") if tonumber(lead_digit .. round_digit) < 20 and (1 + #rest) % 3 == 0 then -- In English numbers < 20 are one word so put 2 digits in lead and round based on 3rd lead_digit = lead_digit .. round_digit round_digit = round_digit_2 else rest = round_digit_2 .. rest end if (round == 'up' and nonzero_digits > 1) or (round == 'on' and tonumber(round_digit) >= 5) then lead_digit = tostring(tonumber(lead_digit) + 1) end -- All digits but lead digit will turn to zero rest = rest:gsub("%d", "0") return (negative and '-' or '') .. lead_digit .. '0' .. rest end local denominators = { [2] = { 'half', plural = 'halves' }, [3] = { 'third' }, [4] = { 'quarter', us = 'fourth' }, [5] = { 'fifth' }, [6] = { 'sixth' }, [8] = { 'eighth' }, [9] = { 'ninth' }, [10] = { 'tenth' }, [16] = { 'sixteenth' }, } -- Return status, fraction where: -- status is a string: -- "finished" if there is a fraction with no whole number; -- "ok" if fraction is empty or valid; -- "unsupported" if bad fraction; -- fraction is a string giving (numerator / denominator) as English text, or is "". -- Only unsigned fractions with a very limited range of values are supported, -- except that if whole is empty, the numerator can use "-" to indicate negative. -- whole (string or nil): nil or "" if no number before the fraction -- numerator (string or nil): numerator, if any (default = 1 if a denominator is given) -- denominator (string or nil): denominator, if any -- sp_us (boolean): true if sp=us -- negative_word (string): word to use for negative sign, if whole is empty -- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half" local function fraction_to_english(whole, numerator, denominator, sp_us, negative_word, use_one) if numerator or denominator then local finished = (whole == nil or whole == '') local sign = '' if numerator then if finished and numerator:sub(1, 1) == '-' then numerator = numerator:sub(2) sign = negative_word .. ' ' end else numerator = '1' end if not numerator:match('^%d+$') or not denominator or not denominator:match('^%d+$') then return 'unsupported', '' end numerator = tonumber(numerator) denominator = tonumber(denominator) local dendata = denominators[denominator] if not (dendata and 1 <= numerator and numerator <= 99) then return 'unsupported', '' end local numstr, denstr local sep = '-' if numerator == 1 then denstr = sp_us and dendata.us or dendata[1] if finished or use_one then numstr = 'one' elseif denstr:match('^[aeiou]') then numstr = 'an' sep = ' ' else numstr = 'a' sep = ' ' end else numstr = numeral_to_english_less_100(numerator) denstr = dendata.plural if not denstr then denstr = (sp_us and dendata.us or dendata[1]) .. 's' end end if finished then return 'finished', sign .. numstr .. sep .. denstr end return 'ok', ' and ' .. numstr .. sep .. denstr end return 'ok', '' end -- Takes a decimal number and converts it to English text. -- Return nil if a fraction cannot be converted (only some numbers are supported for fractions). -- num (string or nil): the number to convert. -- Can be an arbitrarily large decimal, such as "-123456789123456789.345", and -- can use scientific notation (e.g. "1.23E5"). -- May fail for very large numbers not listed in "groups" such as "1E4000". -- num is nil if there is no whole number before a fraction. -- numerator (string or nil): numerator of fraction (nil if no fraction) -- denominator (string or nil): denominator of fraction (nil if no fraction) -- capitalize (boolean): whether to capitalize the result (e.g. 'One' instead of 'one') -- use_and (boolean): whether to use the word 'and' between tens/ones place and higher places -- hyphenate (boolean): whether to hyphenate all words in the result, useful as an adjective -- ordinal (boolean): whether to produce an ordinal (e.g. 'first' instead of 'one') -- plural (boolean): whether to pluralize the resulting number -- links: nil: do not add any links; 'on': link "billion" and larger to Orders of magnitude article; -- any other text: list of numbers to link (e.g. "billion,quadrillion") -- negative_word: word to use for negative sign (typically 'negative' or 'minus'; nil to use default) -- round: nil or '': no rounding; 'on': round to nearest two-word number; 'up'/'down': round up/down to two-word number -- zero: word to use for value '0' (nil to use default) -- use_one (boolean): false: 2+1/2 → "two and a half"; true: "two and one-half" local function _numeral_to_english(num, numerator, denominator, capitalize, use_and, hyphenate, ordinal, plural, links, negative_word, round, zero, use_one) if not negative_word then if use_and then -- TODO Should 'minus' be used when do not have sp=us? -- If so, need to update testcases, and need to fix "minus zero". -- negative_word = 'minus' negative_word = 'negative' else negative_word = 'negative' end end local status, fraction_text = fraction_to_english(num, numerator, denominator, not use_and, negative_word, use_one) if status == 'unsupported' then return nil end if status == 'finished' then -- Input is a fraction with no whole number. -- Hack to avoid executing stuff that depends on num being a number. local s = fraction_text if hyphenate then s = s:gsub("%s", "-") end if capitalize then s = s:gsub("^%l", string.upper) end return s end num = scientific_notation_to_decimal(num) if round and round ~= '' then if round ~= 'on' and round ~= 'up' and round ~= 'down' then error("Invalid rounding mode") end num = round_for_english(num, round) end -- Separate into negative sign, num (digits before decimal), decimal_places (digits after decimal) local MINUS = '−' -- Unicode U+2212 MINUS SIGN (may be in values from [[Module:Convert]]) if num:sub(1, #MINUS) == MINUS then num = '-' .. num:sub(#MINUS + 1) -- replace MINUS with '-' elseif num:sub(1, 1) == '+' then num = num:sub(2) -- ignore any '+' end local negative = num:find("^%-") local decimal_places, subs = num:gsub("^%-?%d*%.(%d+)$", "%1") if subs == 0 then decimal_places = nil end num, subs = num:gsub("^%-?(%d*)%.?%d*$", "%1") if num == '' and decimal_places then num = '0' end if subs == 0 or num == '' then error("Invalid decimal numeral") end -- For each group of 3 digits except the last one, print with appropriate group name (e.g. million) local s = '' while #num > 3 do if s ~= '' then s = s .. ' ' end local group_num = math.floor((#num - 1) / 3) local group = groups[group_num] local group_digits = #num - group_num*3 s = s .. numeral_to_english_less_1000(num:sub(1, group_digits), false, false, false, zero) .. ' ' if links and (((links == 'on' and group_num >= 3) or links:find(group)) and group_num <= 13) then s = s .. '[[Orders_of_magnitude_(numbers)#10' .. group_num*3 .. '|' .. group .. ']]' else s = s .. group end num = num:sub(1 + group_digits) num = num:gsub("^0*", "") -- Trim leading zeros end -- Handle final three digits of integer part if s ~= '' and num ~= '' then if #num <= 2 and use_and then s = s .. ' and ' else s = s .. ' ' end end if s == '' or num ~= '' then s = s .. numeral_to_english_less_1000(num, use_and, ordinal, plural, zero) elseif ordinal or plural then -- Round numbers like "one million" take standard suffixes for ordinal/plural s = s .. standard_suffix(ordinal, plural) end -- For decimal places (if any) output "point" followed by spelling out digit by digit if decimal_places then s = s .. ' point' for i = 1, #decimal_places do s = s .. ' ' .. ones_position[tonumber(decimal_places:sub(i,i))] end end s = s:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace if ordinal and plural then s = s .. 's' end -- s suffix works for all ordinals if negative and s ~= zero then s = negative_word .. ' ' .. s end s = s:gsub("negative zero", "zero") s = s .. fraction_text if hyphenate then s = s:gsub("%s", "-") end if capitalize then s = s:gsub("^%l", string.upper) end return s end local function _numeral_to_english2(args) local num = tostring(args.num) num = num:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace num = num:gsub(",", "") -- Remove commas num = num:gsub("^<span[^<>]*></span>", "") -- Generated by Template:age if num ~= '' then -- a fraction may have an empty whole number if not num:find("^%-?%d*%.?%d*%-?[Ee]?[+%-]?%d*$") then -- Input not in a valid format, try to eval it as an expr to see -- if that produces a number (e.g. "3 + 5" will become "8"). local noerr, result = pcall(mw.ext.ParserFunctions.expr, num) if noerr then num = result end end end -- Call helper function passing args return _numeral_to_english( num, args['numerator'], args['denominator'], args['capitalize'], args['use_and'], args['hyphenate'], args['ordinal'], args['plural'], args['links'], args['negative_word'], args['round'], args['zero'], args['use_one'] ) or '' end local p = { -- Functions that can be called from another module roman_to_numeral = roman_to_numeral, spell_number = _numeral_to_english, spell_number2 = _numeral_to_english2, english_to_ordinal = english_to_ordinal, english_to_numeral = english_to_numeral, } function p._roman_to_numeral(frame) -- Callable via {{#invoke:ConvertNumeric|_roman_to_numeral|VI}} return roman_to_numeral(frame.args[1]) end function p._english_to_ordinal(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_ordinal|First}} return english_to_ordinal(frame.args[1]) end function p._english_to_numeral(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_numeral|One}} return english_to_numeral(frame.args[1]) end function p.numeral_to_english(frame) local args = frame.args -- Tail call to helper function passing args from frame return _numeral_to_english2{ ['num'] = args[1], ['numerator'] = args['numerator'], ['denominator'] = args['denominator'], ['capitalize'] = args['case'] == 'U' or args['case'] == 'u', ['use_and'] = args['sp'] ~= 'us', ['hyphenate'] = args['adj'] == 'on', ['ordinal'] = args['ord'] == 'on', ['plural'] = args['pl'] == 'on', ['links'] = args['lk'], ['negative_word'] = args['negative'], ['round'] = args['round'], ['zero'] = args['zero'], ['use_one'] = args['one'] == 'one' -- experiment: using '|one=one' makes fraction 2+1/2 give "two and one-half" instead of "two and a half" } end ---- recursive function for p.decToHex local function decToHexDigit(dec) local dig = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"} local div = math.floor(dec/16) local mod = dec-(16*div) if div >= 1 then return decToHexDigit(div)..dig[mod+1] else return dig[mod+1] end end -- I think this is supposed to be done with a tail call but first I want something that works at all ---- finds all the decimal numbers in the input text and hexes each of them function p.decToHex(frame) local args=frame.args local parent=frame.getParent(frame) local pargs={} if parent then pargs=parent.args end local text=args[1] or pargs[1] or "" local minlength=args.minlength or pargs.minlength or 1 minlength=tonumber(minlength) local prowl=mw.ustring.gmatch(text,"(.-)(%d+)") local output="" repeat local chaff,dec=prowl() if not(dec) then break end local hex=decToHexDigit(dec) while (mw.ustring.len(hex)<minlength) do hex="0"..hex end output=output..chaff..hex until false local chaff=mw.ustring.match(text,"(%D+)$") or "" return output..chaff end return p dbb876f8710ee1407b421a28b3e9bc5a6ea36cda Template:Fraction 10 727 1118 1117 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported wikitext text/x-wiki <templatestyles src="Fraction/styles.css" /><!-- --><span class="frac"><!-- -->{{#if:{{{3|}}}<!-- if 3 -->|{{{1}}}<span class="sr-only">+</span><span class="num">{{{2}}}</span>&frasl;<span class="den">{{{3}}}</span><!-- then 1 2/3 -->|{{#if:{{{2|}}}<!-- elseif 2 -->|<span class="num">{{{1}}}</span>&frasl;<span class="den">{{{2}}}</span><!-- then 1/2 -->|{{#if:{{{1|}}}<!-- elseif 1 -->|<span class="num">1</span>&frasl;<span class="den">{{{1}}}</span><!-- then 1/1 -->|&frasl;<!-- else 0, a slash -->}}<!-- endif 1 -->}}<!-- endif 2 -->}}<!-- endif 3 --></span><noinclude> {{documentation}} </noinclude> 92a487359898e00b80676732b41757019446ae53 Template:Fraction/styles.css 10 728 1120 1119 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported sanitized-css text/css /* {{pp|small=y}} */ .frac { white-space: nowrap; } .frac .num, .frac .den { font-size: 80%; line-height: 0; /* we want this inline */ vertical-align: super; } .frac .den { vertical-align: sub; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } b28507c69a3866957f0cad2cbdb76d24154ba271 Template:Sfrac 10 729 1122 1121 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{ {{{|safesubst:}}}#invoke:Unsubst||$B=<templatestyles src="Sfrac/styles.css" /><span class="sfrac">&NoBreak;{{#if:{{{3|}}}|{{{1}}}<span class="sr-only">+</span>}}<!-- --><span class="tion" {{#if:{{{font-size|}}}|style="font-size:{{{font-size}}}"}}><!-- --><span class="num">{{#if:{{{3|}}}|{{{2}}}|{{#if:{{{2|}}}|{{{1}}}|1}}}}</span><!-- --><span class="sr-only">/</span><!-- --><span class="den">{{{3|{{{2|{{{1|1}}}}}}}}}</span><!-- --></span><!-- -->&NoBreak;</span>}}<noinclude> {{documentation}} <!-- Add categories to /doc subpage, not here. --> </noinclude> 1a4f22ed67a613ab0f1d9abf9816187efc00f50a Module:Unsubst 828 730 1124 1123 2025-08-22T00:55:52Z Sharparam 284703 1 revision imported Scribunto text/plain local checkType = require('libraryUtil').checkType local p = {} local BODY_PARAM = '$B' local specialParams = { ['$params'] = 'parameter list', ['$aliases'] = 'parameter aliases', ['$flags'] = 'flags', ['$B'] = 'template content', ['$template-name'] = 'template invocation name override', } function p.main(frame, body) -- If we are substing, this function returns a template invocation, and if -- not, it returns the template body. The template body can be specified in -- the body parameter, or in the template parameter defined in the -- BODY_PARAM variable. This function can be called from Lua or from -- #invoke. -- Return the template body if we aren't substing. if not mw.isSubsting() then if body ~= nil then return body elseif frame.args[BODY_PARAM] ~= nil then return frame.args[BODY_PARAM] else error(string.format( "no template content specified (use parameter '%s' from #invoke)", BODY_PARAM ), 2) end end -- Sanity check for the frame object. if type(frame) ~= 'table' or type(frame.getParent) ~= 'function' or not frame:getParent() then error( "argument #1 to 'main' must be a frame object with a parent " .. "frame available", 2 ) end -- Find the invocation name. local mTemplateInvocation = require('Module:Template invocation') local name if frame.args['$template-name'] and '' ~= frame.args['$template-name'] then name = frame.args['$template-name'] -- override whatever the template name is with this name else name = mTemplateInvocation.name(frame:getParent():getTitle()) end -- Combine passed args with passed defaults local args = {} if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then for k, v in pairs( frame:getParent().args ) do args[k] = v end for k, v in pairs( frame.args ) do if not specialParams[k] then if v == '__DATE__' then v = mw.getContentLanguage():formatDate( 'F Y' ) end args[k] = v end end else for k, v in pairs( frame.args ) do if not specialParams[k] then if v == '__DATE__' then v = mw.getContentLanguage():formatDate( 'F Y' ) end args[k] = v end end for k, v in pairs( frame:getParent().args ) do args[k] = v end end -- Trim parameters, if not specified otherwise if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end end -- Pull information from parameter aliases local aliases = {} if frame.args['$aliases'] then local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' ) for k, v in ipairs( list ) do local tmp = mw.text.split( v, '%s*>%s*' ) aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2]) end end for k, v in pairs( aliases ) do if args[k] and ( not args[v] or args[v] == '' ) then args[v] = args[k] end args[k] = nil end -- Remove empty parameters, if specified if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then local tmp = 0 for k, v in ipairs( args ) do if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then tmp = k else break end end for k, v in pairs( args ) do if v == '' then if not (type(k) == 'number' and k < tmp) then args[k] = nil end end end end -- Order parameters if frame.args['$params'] then local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {} for k, v in ipairs(params) do v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v if args[v] then tmp[v], args[v] = args[v], nil end end for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end args = tmp end return mTemplateInvocation.invocation(name, args) end p[''] = p.main -- For backwards compatibility return p 7f01ffc8aa2ac4a4772f14c12e0b77e384ecabb6 Module:Template invocation 828 731 1126 1125 2025-08-22T00:55:53Z Sharparam 284703 1 revision imported Scribunto text/plain -- This module provides functions for making MediaWiki template invocations. local checkType = require('libraryUtil').checkType local p = {} ------------------------------------------------------------------------ -- Name: p.name -- Purpose: Find a template invocation name from a page name or a -- mw.title object. -- Description: This function detects whether a string or a mw.title -- object has been passed in, and uses that to find a -- template name as it is used in template invocations. -- Parameters: title - full page name or mw.title object for the -- template (string or mw.title object) -- Returns: String ------------------------------------------------------------------------ function p.name(title) if type(title) == 'string' then title = mw.title.new(title) if not title or #title.prefixedText == 0 or #title.interwiki > 0 then error("invalid title in parameter #1 of function 'name'", 2) end elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then error("parameter #1 of function 'name' must be a string or a mw.title object", 2) end if title.namespace == 10 then local text = title.text local check = mw.title.new(text, 10) -- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo". return check and mw.title.equals(title, check) and text or title.prefixedText elseif title.namespace == 0 then return ':' .. title.prefixedText else return title.prefixedText end end ------------------------------------------------------------------------ -- Name: p.invocation -- Purpose: Construct a MediaWiki template invocation. -- Description: This function makes a template invocation from the -- name and the arguments given. Note that it isn't -- perfect: we have no way of knowing what whitespace was -- in the original invocation, the named parameters will be -- alphabetically sorted, and any parameters with duplicate keys -- will be removed. -- Parameters: name - the template name, formatted as it will appear -- in the invocation. (string) -- args - a table of template arguments. (table) -- format - formatting options. (string, optional) -- Set to "nowiki" to escape, curly braces, pipes and -- equals signs with their HTML entities. The default -- is unescaped. -- Returns: String ------------------------------------------------------------------------ function p.invocation(name, args, format) checkType('invocation', 1, name, 'string') checkType('invocation', 2, args, 'table') checkType('invocation', 3, format, 'string', true) -- Validate the args table and make a copy to work from. We need to -- make a copy of the table rather than just using the original, as -- some of the values may be erased when building the invocation. local invArgs = {} for k, v in pairs(args) do local typek = type(k) local typev = type(v) if typek ~= 'string' and typek ~= 'number' or typev ~= 'string' and typev ~= 'number' then error("invalid arguments table in parameter #2 of " .. "'invocation' (keys and values must be strings or numbers)", 2) end invArgs[k] = v end -- Get the separators to use. local seps = { openb = '{{', closeb = '}}', pipe = '|', equals = '=' } if format == 'nowiki' then for k, v in pairs(seps) do seps[k] = mw.text.nowiki(v) end end -- Build the invocation body with numbered args first, then named. local ret = {} ret[#ret + 1] = seps.openb ret[#ret + 1] = name for k, v in ipairs(invArgs) do if type(v) == 'string' and v:find('=', 1, true) then -- Likely something like 1=foo=bar which needs to be displayed as a named arg. else ret[#ret + 1] = seps.pipe ret[#ret + 1] = v invArgs[k] = nil -- Erase the key so that we don't add the value twice end end local keys = {} -- sort parameter list; better than arbitrary order for k, _ in pairs(invArgs) do keys[#keys + 1] = k end table.sort(keys, function (a, b) -- Sort with keys of type number first, then string. if type(a) == type(b) then return a < b elseif type(a) == 'number' then return true end end ) local maybeSpace = '' -- First named parameter should not be separated by a space for _, v in ipairs(keys) do -- Add named args based on sorted parameter list ret[#ret + 1] = maybeSpace .. seps.pipe ret[#ret + 1] = tostring(v) ret[#ret + 1] = seps.equals ret[#ret + 1] = invArgs[v] maybeSpace = ' ' end ret[#ret + 1] = seps.closeb return table.concat(ret) end return p 1670c64056477574789c5c21349ec2234f60dd9c Template:Sfrac/styles.css 10 732 1128 1127 2025-08-22T00:55:53Z Sharparam 284703 1 revision imported sanitized-css text/css /* {{pp|small=y}} */ .sfrac { white-space: nowrap; } .sfrac.tion, .sfrac .tion { display: inline-block; vertical-align: -0.5em; font-size: 85%; text-align: center; } .sfrac .num { display: block; line-height: 1em; margin: 0.0em 0.1em; border-bottom: 1px solid; } .sfrac .den { display: block; line-height: 1em; margin: 0.1em 0.1em; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); /* removed from CSS */ clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } 197429395812c1ab351775e9ab127ae0ef74564e Coordinates 0 342 1129 455 2025-08-22T00:56:56Z Sharparam 284703 Use {{tl|val}} again wikitext text/x-wiki {{About|the game concept|specifying coordinates in a wiki article|Template:Coordinates}} '''{{PAGENAME}}''' are used to indicate the player's location in the world. == Overview == The player's coordinates consist of three components: the X, Y, and Z coordinate. X and Y denote the position on the horizontal plane, while Z is the vertical position (height). == Bugs == * The coordinates as displayed inside the game on the inventory screen are often incorrect. The game truncates each coordinate value to only show the first four digits. As an example, if the player is at X coordinate {{val|13529}} (five digits), the game will show it as {{val|1352}} (four digits). To get an accurate position, usage of software that can enable the Unreal Engine debug HUD is required. If using the Unreal Engine Unlocker software, enable the debug HUD by using the <code>showdebug</code> command. == External links == * [https://dev.epicgames.com/documentation/en-us/unreal-engine/coordinate-system-and-spaces-in-unreal-engine Coordinate System and Spaces] in the Unreal Engine documentation [[Category:Game mechanics]] 4b2a35e53034534a2fd7a260f1c18bf681e114ed Template:Para 10 733 1130 2025-08-22T01:04:13Z Sharparam 284703 Created page with "<code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">&#124;{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}&#61..." wikitext text/x-wiki <code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">&#124;{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}&#61;}}{{{2|}}}</code><noinclude> {{Documentation}} <!--Categories and interwikis go near the bottom of the /doc subpage.--> </noinclude> 06006deea2ed5d552aab61b4332321ab749ae7e8 Template:Para/doc 10 734 1131 2025-08-22T01:04:53Z Sharparam 284703 Created page with "== External links == * [[wikipedia:Template:Para|Template and documentation on Wikipedia]] <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == External links == * [[wikipedia:Template:Para|Template and documentation on Wikipedia]] <noinclude>[[Category:Template documentation]]</noinclude> 8ae906ad9a1b93d7d7300c0e02c2e6a8b63d28c7 Template:About/doc 10 735 1132 2025-08-22T01:07:58Z Sharparam 284703 Created page with "<!-- Categories go where indicated at the bottom of this page, please. --> {{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead. ==Usage== This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including: *{{Tlx|About}}..." wikitext text/x-wiki <!-- Categories go where indicated at the bottom of this page, please. --> {{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead. ==Usage== This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including: *{{Tlx|About}} → {{About}} *{{Tlx|About|Use1}} → {{About|Use1}} *{{Tlx|About|<nowiki/>|Use2|Article2}} → {{About||Use2|Article2}} *{{Tlx|About|<nowiki/>|<nowiki/>||Article (disambiguation)}} → {{About|||Article (disambiguation)}} *{{Tlx|About|Use1|<nowiki/>|Article2}} → {{About|Use1||Article2}} *{{Tlx|About|Use1|<nowiki/>|Article2|and|Article3}} → {{About|Use1||Article2|and|Article3}} *{{Tlx|About|Use1|Use2|Article2}} → {{About|Use1|Use2|Article2}} *{{Tlx|About|Use1|Use2|Article2|and|Article3}} → {{About|Use1|Use2|Article2|and|Article3}} *{{Tlx|About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} → {{About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} *{{Tlx|About|Use1|Use2|Article2|Use3|Article3}} → {{About|Use1|Use2|Article2|Use3|Article3}} *{{Tlx|About|Use1|Use2|Article2|other uses}} → {{About|Use1|Use2|Article2|other uses}} The template {{tl|For-multi}} produces the same hatnote, but without the initial ''This template is about''. === Styling in italics === Please see [[wikipedia:Wikipedia:Hatnote#Hatnotes with italics in the links]] ([[wikipedia:WP:ITHAT]]) for details about how to use italics in hatnotes. ==Parameters== Alternately, a {{para|section|yes}} parameter can be added to the {{Tl|About}} template for use at the top of a section. When using this parameter, the wording in the template changes to specify that it is being used in a section: *{{Tlx|About|Use1|<nowiki>section=yes</nowiki>}} → {{About|Use1|section=yes}} *{{Tlx|About|Use1|<nowiki/>|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1||Article2|section=yes}} *{{Tlx|About|Use1|Use2|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|section=yes}} *{{Tlx|About|Use1|Use2|Article2|and|Article3|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|and|Article3|section=yes}} *{{Tlx|About|Use1|Use2|Article2|other uses|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|other uses|section=yes}} A {{para|text}} option adds text to the end; this should only be used when truly necessary, when the other hatnote templates listed below don't suffice. The {{para|selfref|yes}} option marks the entire hatnote as a Wikipedia self-reference, causing it to be omitted when the page content is reused outside of Wikipedia (see {{tl|self reference}} and [[wikipedia:MOS:SELFREF]] for more details). For more options, see section "TemplateData" below. ==TemplateData== <!--{{TemplateData header}}--> <!-- Should this mention the existence of "and"? It's something of a can of worms, since it only looks as though it only works in certain combinations of the other page 2/3/4 description fields... --> <templatedata> { "description": "This template is a hatnote in the format \"This page is about … For other uses …\".", "params": { "1": { "label": "Page description", "type": "string", "description": "What the page this template is placed on is about (\"This page is about …\")", "suggested": true }, "2": { "label": "Other page 1 description", "type": "string", "description": "What the first other page is about. If unused or blank, defaults to \"other uses\".", "suggested": true }, "3": { "label": "Other page 1 title", "type": "wiki-page-name", "description": "The title of the first other page. If unused, defaults to \"[page title] (disambiguation)\".", "suggested": true }, "4": { "label": "Other page 2 description", "type": "string", "description": "What the second other page is about." }, "5": { "label": "Other page 2 title", "type": "wiki-page-name", "description": "The title of the second other page. If unused or blank and parameter 4 exists, defaults to \"[page title] (disambiguation)\"." }, "6": { "label": "Other page 3 description", "type": "string", "description": "What the third other page is about." }, "7": { "label": "Other page 3 title", "type": "wiki-page-name", "description": "The title of the third other page. If unused or blank and parameter 6 exists, defaults to \"[page title] (disambiguation)\"." }, "8": { "label": "Other page 4 description", "type": "string", "description": "What the fourth other page is about." }, "9": { "label": "Other page 4 title", "type": "wiki-page-name", "description": "The title of the fourth other page. If unused or blank and parameter 8 exists, defaults to \"[page title] (disambiguation)\"." }, "section": { "type": "string", "description": "Pass \"yes\" in this parameter to get wording appropriate for use at the top of a section.", "autovalue": "yes" }, "text": { "label": "Custom text", "type": "string", "description": "Text to be appended to the end." } } } </templatedata> ==See also== * [[wikipedia:Wikipedia:Hatnote]] <!--{{Hatnote templates}}--> <!-- To add more other pages, continue with this alternating pattern using increasing numbers, starting with 6 for the next page description. --> <includeonly>{{Sandbox other|| <!-- Categories go below this line, please; interwikis go to Wikidata, thank you! --> [[Category:Disambiguation and redirection hatnote templates]] }}</includeonly> 979c2e2e08324dcf5adc700fd845b19dfeaacf79 Module:Hatnote 828 338 1133 444 2025-08-22T01:17:45Z Sharparam 284703 Add support for icon Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules. -- -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local yesno -- lazily initialise [[Module:Yesno]] local formatLink -- lazily initialise [[Module:Format link]] ._formatLink local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end function p.defaultClasses(inline) -- Provides the default hatnote classes as a space-separated string; useful -- for hatnote-manipulation modules like [[Module:Hatnote group]]. return (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' .. 'navigation-not-searchable' end function p.disambiguate(page, disambiguator) -- Formats a page title with a disambiguation parenthetical, -- i.e. "Example" → "Example (disambiguation)". checkType('disambiguate', 1, page, 'string') checkType('disambiguate', 2, disambiguator, 'string', true) disambiguator = disambiguator or 'disambiguation' return mw.ustring.format('%s (%s)', page, disambiguator) end function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to false. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end function p.makeWikitextError(msg, helpLink, addTrackingCategory, title) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- [[Module:Yesno]], and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') title = title or mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' ([[' .. helpLink .. '|help]])' else helpText = '' end -- Make the category text. local category if not title.isTalkPage -- Don't categorise talk pages and title.namespace ~= 2 -- Don't categorise userspace and yesno(addTrackingCategory) ~= false -- Allow opting out then category = 'Hatnote templates with errors' category = mw.ustring.format( '[[%s:%s]]', mw.site.namespaces[14].name, category ) else category = '' end return mw.ustring.format( '<strong class="error">Error: %s%s.</strong>%s', msg, helpText, category ) end local curNs = mw.title.getCurrentTitle().namespace p.missingTargetCat = --Default missing target category, exported for use in related modules ((curNs == 0) or (curNs == 14)) and 'Articles with hatnote templates targeting a nonexistent page' or nil function p.quote(title) --Wraps titles in quotation marks. If the title starts/ends with a quotation --mark, kerns that side as with {{-'}} local quotationMarks = { ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true } local quoteLeft, quoteRight = -- Test if start/end are quotation marks quotationMarks[string.sub(title, 1, 1)], quotationMarks[string.sub(title, -1, -1)] if quoteLeft or quoteRight then title = mw.html.create("span"):wikitext(title) end if quoteLeft then title:css("padding-left", "0.15em") end if quoteRight then title:css("padding-right", "0.15em") end return '"' .. tostring(title) .. '"' end -------------------------------------------------------------------------------- -- Hatnote -- -- Produces standard hatnote text. Implements the {{hatnote}} template. -------------------------------------------------------------------------------- p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end function p.hatnote(frame) local args = getArgs(frame) local s = args[1] if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end return p._hatnote(s, { extraclasses = args.extraclasses, selfref = args.selfref, icon = args.icon }) end function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) options = options or {} local inline = options.inline local hatnote = mw.html.create(inline == 1 and 'span' or 'div') local extraclasses if type(options.extraclasses) == 'string' then extraclasses = options.extraclasses end if options.icon then s = "[[File:" .. options.icon .. "|x22px]]<nowiki> </nowiki>" .. s end hatnote :attr('role', 'note') :addClass(p.defaultClasses(inline)) :addClass(extraclasses) :addClass(options.selfref and 'selfref' or nil) :wikitext(s) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' } } .. tostring(hatnote) end return p d64ac2e25fd54ca6e166cec9072b7aa98428e6a6 Module:About/doc 828 736 1134 2025-08-22T01:21:54Z Sharparam 284703 Created page with "<!-- Please place categories where indicated at the bottom of this page --> This module implements the {{tl|about}} [[wikipedia:Wikipedia:Hatnote|hatnote]] template. == Usage == *The <code>about</code> function implements the {{tl|about}} template directly, using the frame and applying no options. This should probably only be used in {{tl|about}}. *The <code>_about</code> function can be used from Lua to supply a custom arguments list (its first argument) and/or an opt..." wikitext text/x-wiki <!-- Please place categories where indicated at the bottom of this page --> This module implements the {{tl|about}} [[wikipedia:Wikipedia:Hatnote|hatnote]] template. == Usage == *The <code>about</code> function implements the {{tl|about}} template directly, using the frame and applying no options. This should probably only be used in {{tl|about}}. *The <code>_about</code> function can be used from Lua to supply a custom arguments list (its first argument) and/or an options table (its second argument). Options include: **<code>aboutForm</code> A string that can be used to substitute the form of the initial "about" message. It should include two substitution points: the first for the page type (e.g. "article"), and the second for the description of what the page is about. It should also include a trailing space for easy concatenation or omission. Defaults to <code>'This %s is about %s. '</code>. **<code>sectionString</code> Gives the page type string for when the named argument <code>section</code> is specified. Defaults to <code>'section'</code>. == Examples == * {{#invoke:about|about|disambiguation}} <includeonly>{{Sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules]] }}</includeonly> ad89dfe0b6218335ce723e879ab0c16dedb02eb3 Module:About 828 339 1135 446 2025-08-22T01:23:37Z Sharparam 284703 Set an icon Scribunto text/plain local mArguments --initialize lazily local mHatnote = require('Module:Hatnote') local mHatList = require('Module:Hatnote list') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.about (frame) -- A passthrough that gets args from the frame and all mArguments = require('Module:Arguments') args = mArguments.getArgs(frame) return p._about(args) end function p._about (args, options) -- Produces "about" hatnote. -- Type checks and defaults checkType('_about', 1, args, 'table', true) args = args or {} checkType('_about', 2, options, 'table', true) options = options or {} local defaultOptions = { aboutForm = 'This %s is about %s. ', PageType = require('Module:Pagetype').main(), otherText = nil, --included for complete list sectionString = 'section' } for k, v in pairs(defaultOptions) do if options[k] == nil then options[k] = v end end -- Set initial "about" string local pageType = (args.section and options.sectionString) or options.PageType local about = '' if args[1] then about = string.format(options.aboutForm, pageType, args[1]) end --Allow passing through certain options local fsOptions = { otherText = options.otherText, extratext = args.text } local hnOptions = { selfref = args.selfref } if not args.noicon then hnOptions.icon = args.icon or "Disambig.svg" end -- Set for-see list local forSee = mHatList._forSee(args, 2, fsOptions) -- Concatenate and return return mHatnote._hatnote(about .. forSee, hnOptions) end return p acef7e76987e5cbb64cae252e876f16e8b980a9a Module:Hatnote 828 338 1136 1133 2025-08-22T01:25:40Z Sharparam 284703 Use nbsp instead of nowiki tag Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules. -- -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local yesno -- lazily initialise [[Module:Yesno]] local formatLink -- lazily initialise [[Module:Format link]] ._formatLink local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end function p.defaultClasses(inline) -- Provides the default hatnote classes as a space-separated string; useful -- for hatnote-manipulation modules like [[Module:Hatnote group]]. return (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' .. 'navigation-not-searchable' end function p.disambiguate(page, disambiguator) -- Formats a page title with a disambiguation parenthetical, -- i.e. "Example" → "Example (disambiguation)". checkType('disambiguate', 1, page, 'string') checkType('disambiguate', 2, disambiguator, 'string', true) disambiguator = disambiguator or 'disambiguation' return mw.ustring.format('%s (%s)', page, disambiguator) end function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to false. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end function p.makeWikitextError(msg, helpLink, addTrackingCategory, title) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- [[Module:Yesno]], and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') title = title or mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' ([[' .. helpLink .. '|help]])' else helpText = '' end -- Make the category text. local category if not title.isTalkPage -- Don't categorise talk pages and title.namespace ~= 2 -- Don't categorise userspace and yesno(addTrackingCategory) ~= false -- Allow opting out then category = 'Hatnote templates with errors' category = mw.ustring.format( '[[%s:%s]]', mw.site.namespaces[14].name, category ) else category = '' end return mw.ustring.format( '<strong class="error">Error: %s%s.</strong>%s', msg, helpText, category ) end local curNs = mw.title.getCurrentTitle().namespace p.missingTargetCat = --Default missing target category, exported for use in related modules ((curNs == 0) or (curNs == 14)) and 'Articles with hatnote templates targeting a nonexistent page' or nil function p.quote(title) --Wraps titles in quotation marks. If the title starts/ends with a quotation --mark, kerns that side as with {{-'}} local quotationMarks = { ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true } local quoteLeft, quoteRight = -- Test if start/end are quotation marks quotationMarks[string.sub(title, 1, 1)], quotationMarks[string.sub(title, -1, -1)] if quoteLeft or quoteRight then title = mw.html.create("span"):wikitext(title) end if quoteLeft then title:css("padding-left", "0.15em") end if quoteRight then title:css("padding-right", "0.15em") end return '"' .. tostring(title) .. '"' end -------------------------------------------------------------------------------- -- Hatnote -- -- Produces standard hatnote text. Implements the {{hatnote}} template. -------------------------------------------------------------------------------- p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end function p.hatnote(frame) local args = getArgs(frame) local s = args[1] if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end return p._hatnote(s, { extraclasses = args.extraclasses, selfref = args.selfref, icon = args.icon }) end function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) options = options or {} local inline = options.inline local hatnote = mw.html.create(inline == 1 and 'span' or 'div') local extraclasses if type(options.extraclasses) == 'string' then extraclasses = options.extraclasses end if options.icon then s = "[[File:" .. options.icon .. "|x22px]]&nbsp;" .. s end hatnote :attr('role', 'note') :addClass(p.defaultClasses(inline)) :addClass(extraclasses) :addClass(options.selfref and 'selfref' or nil) :wikitext(s) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' } } .. tostring(hatnote) end return p 091300bfb29ce9b01a1d4dc1da72ab20f2626119 File:OrientalSpin.png 6 737 1137 2025-08-22T01:28:42Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_OrientalSpin }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_OrientalSpin }} == Licensing == {{License|game}} d8bfd3f92a2c9aea494cf47fe9c8809e50bca9a6 File:OrientalDash.png 6 738 1138 2025-08-22T01:29:29Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_OrientalDash }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_OrientalDash }} == Licensing == {{License|game}} b923ea1591e8c5bfa6d06623e2d555c4ae527c36 File:Divine Blessing.png 6 739 1139 2025-08-22T01:30:11Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_DivineBlessing }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_DivineBlessing }} == Licensing == {{License|game}} eef9d3c7cbbdc0f9694687aa8f9380456c9dedeb File:Site-favicon.ico 6 283 1140 308 2025-08-22T01:32:14Z Sharparam 284703 Changed protection settings for "[[File:Site-favicon.ico]]": Favicon used for the entire site ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki == Licensing == {{License|game}} 5fdc0517c60eec1aa02a1fef9763fa88c38be9ad User:Sharparam/common.js 2 740 1141 2025-08-22T01:36:53Z Sharparam 284703 Created page with "mw.loader.load( '//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/load.js&action=raw&ctype=text/javascript' ); // Backlink: [[en:User:Joeytje50/JWB.js/load.js]]" javascript text/javascript mw.loader.load( '//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/load.js&action=raw&ctype=text/javascript' ); // Backlink: [[en:User:Joeytje50/JWB.js/load.js]] ac852b5cb6bbc8c580ce7702ab0c747386409016 Blok 6174 0 741 1143 1142 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Blok 6147]] 3ee370bab2292ee469f53ad5d06af212bbb3db85 Captain Yulia 0 742 1145 1144 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Royal Division Captain Yulia]] 944a6e86bec704d704b6109fc690822aa40d60b9 Dual Wield Mastery 0 743 1147 1146 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki [[File:Dual_Wield_Mastery.png|thumb]] '''{{PAGENAME}}''' is a [[perk]] in {{BFF}}. It improves proficiency with [[dual wield]] [[weapons]]. == Effect == Offhand weapons now deal 60% of their damage instead of 35%. == Upgrades == * Critical Chance increases by 1% with each combo point while dual wielding. * While dual wielding, you do not consume any stamina for melee attacks if at 15 or above combo points. {{Navbox/Perks}} [[Category:Perks]] 78e20c9ebd95bf46994bc694995631a11d79d8b6 Improved Diver's Lungs Concoction 0 744 1149 1148 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki == Recipe == Obtained by defeating the many-legged creature in [[Deluge]]. a1b23855f2d6d50d291ff7ec5da567ce7c83641d Librarian 0 745 1151 1150 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''Librarian''' may refer to: == Common meanings == * [[Librarian (armor set)]], a light armor set * [[Librarian (enemy)]], the enemy in the [[Monastery]] == See also == * [[Librarian Hood]] * [[Librarian Overcoat]] * [[Librarian Trousers]] {{Disambiguation}} c7eb5b123cb7063d1af9038ba92b3013df3b5b50 Perk 0 746 1153 1152 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Perks]] 22eac196aff02ba31a4bced80e80fcfdc8051202 Perks 0 747 1155 1154 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki '''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time. {{Navbox/Perks}} 26af41c73ec1c4e20599336d60d88a8378c8c6ab 1180 1155 2025-08-22T09:24:46Z Sharparam 284703 Add category wikitext text/x-wiki '''{{PAGENAME}}''' are powerful passive upgrades in {{BFF}}. The player can have up to four active perks at one time. {{Navbox/Perks}} [[Category:Perks]] d2a40a35f7371d4439016c2e06a6a0ad6ee3d71e Ring of Serpent 0 748 1157 1156 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Ring | image = Ring of Serpent.png | title = {{PAGENAME}} | Passives = [[Swift Reflexes]] | Effect1 = +2 [[Agility]] }} == Location == Near one of the underwater red lights in [[Deluge]]. {{Navbox/Rings}} 66cfb985c30744dba393ecfef89461918d2773f8 Saracen Shield 0 749 1159 1158 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Saracen Shield.png | Weight = Heavy | Abilities = [[Regal Radiance]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 57.4 | Mk2_Technomancy = 69.3 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{cords|3760|1142|-1395}} Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield. {{Navbox/Shields}} 59fda45f4bdf41eba1f4a2bcf8c2764d16851685 Spiked Shield 0 750 1161 1160 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Spiked Shield.png | Weight = Heavy | Passives = [[Spikes]] | Mk0_Sharp = 48.6 | Mk0_Blunt = 54.6 | Mk0_Technomancy = 49.8 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Acquisition == Dropped by [[Plagued Warden]]. {{Navbox/Shields}} 35d72a537a85e4efbf9cffb04c27d03f7ce129cf Tall Military Shield 0 751 1163 1162 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Shield | image = Tall Military Shield.png | title = {{PAGENAME}} | Weight = Heavy | Abilities = [[Improvised Fortification]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 66.5 | Mk2_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] that can be equipped by the player. It is the tall version of [[Military Shield|the Military Shield]]. == Location == {{coords|-4043|1327|1056}} Found in [[Asylum]]. After climbing a set of stars inside the first building after the courtyard, the item is at the top on one of the catwalks. {{Navbox/Shields}} 181aab1accc7978058774e9cab9eea6c94c3154c Tech Shield 0 752 1165 1164 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Tech Shield.png | Weight = Heavy | Abilities = [[Refraction]] | Mk2_Sharp = 42.7 | Mk2_Blunt = 47.6 | Mk2_Technomancy = 70 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{coords|1327|-9333|1892}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. Starting at the [[Homunculus]], head through the doorway and take the path on the left. After reaching the outdoors area, head up the stairs and take the left path. At the end is a cliff, climb it by standing near it and repeatedly tapping the jump button. Once on top of the cliff, go to the right and you'll see the corpse with the item against a cliff wall. On the same corpse can also be found the [[Ring of Rammstein]]. {{Navbox/Shields}} 1e64b4aa14aac12ca5c32867c37f664acb36dedf Vermillion Mirage 0 753 1167 1166 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki #REDIRECT [[Royal Division Captain Yulia & Vermillion Mirage]] a706f52584d29641b5b3d4ebd9403828f396a0e3 Wooden Shield 0 754 1169 1168 2025-08-22T09:16:38Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{Infobox/Shield | image = Wooden Shield.png | title = {{PAGENAME}} | Weight = Light | Mk0_Sharp = 52.8 | Mk0_Blunt = 46.8 | Mk0_Technomancy = 7.2 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}} a25cde7cfde39f917e98c499b4c23d236886a94f File:Wooden Shield.png 6 755 1170 2025-08-22T09:17:39Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_WoodenShield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_WoodenShield }} == Licensing == {{License|game}} 65508572de4edc9222f8c1c667c5020f6d0fddc4 File:Tech Shield.png 6 756 1171 2025-08-22T09:18:33Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TechShield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TechShield }} == Licensing == {{License|game}} 53a27f76eadb3cf7a3d774086d9e55de6edb33b1 File:Tall Military Shield.png 6 757 1172 2025-08-22T09:19:10Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TallMilitaryShield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TallMilitaryShield }} == Licensing == {{License|game}} df5b45ff8cfd7e7372508c13ab75e10f21dc3420 File:Spiked Shield.png 6 758 1173 2025-08-22T09:19:50Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_spikedshield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_spikedshield }} == Licensing == {{License|game}} 50d0b50e059bfba7957bc670777b1cb0c168a443 File:Saracen Shield.png 6 759 1174 2025-08-22T09:20:25Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_SaracenShield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_SaracenShield }} == Licensing == {{License|game}} c19959878faaa9e9fa1530b62b6ea1806329b9b1 Template:Navbox/Rings 10 292 1175 376 2025-08-22T09:20:56Z Sharparam 284703 Add [[Ring of Serpent]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Burning Desire]] * [[Ring of Casting Speed]] * [[Ring of Hawk]] * [[Ring of Rammstein]] * [[Ring of Serpent]] * [[Ring of Lesser Talent]] * [[Ring of Talent]] * [[Ring of Exceeding Talent]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 1bf7926b4eef3b181e1771fd1c0e79707833bf81 Template:Navbox/Perks 10 760 1176 2025-08-22T09:21:40Z Sharparam 284703 Created page with "{{Navbox | template = Navbox/Perks | title = [[Perks]] | list1 = * [[Archery Mastery]] * [[Berserker]] * [[Combo Brutality]] * [[Companions]] * [[Debuff Mastery]] * [[Dual Wield Mastery]] * [[Duellist]] * [[Faithful]] * [[Illusionist]] * [[Impenetrable Fortress]] * [[Mindbreaker]] * [[Natural Talent]] * [[Shield Mastery]] * [[Technomancer]] * [[Tinkerer Mastery]] * [[Vampirism]] * [[Vindicator]] * [[Zealot]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | template = Navbox/Perks | title = [[Perks]] | list1 = * [[Archery Mastery]] * [[Berserker]] * [[Combo Brutality]] * [[Companions]] * [[Debuff Mastery]] * [[Dual Wield Mastery]] * [[Duellist]] * [[Faithful]] * [[Illusionist]] * [[Impenetrable Fortress]] * [[Mindbreaker]] * [[Natural Talent]] * [[Shield Mastery]] * [[Technomancer]] * [[Tinkerer Mastery]] * [[Vampirism]] * [[Vindicator]] * [[Zealot]] }}<noinclude>{{Documentation}}</noinclude> abe876ef8a1c6f16d735fa1468f3cc9921221f03 Template:Navbox/Perks/doc 10 761 1177 2025-08-22T09:22:09Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude> 87827f6829955b934e0e8073491c0fef23954bf8 File:Dual Wield Mastery.png 6 762 1178 2025-08-22T09:24:06Z Sharparam 284703 {{Game image | path = Game/Textures/Perks/Icons/Dual }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Perks/Icons/Dual }} == Licensing == {{License|game}} c570af8c6721a2242f2b71c9db9950d9ee24c748 Category:Perks 14 763 1179 2025-08-22T09:24:30Z Sharparam 284703 Created page with "[[Perks]] in {{BFF}}." wikitext text/x-wiki [[Perks]] in {{BFF}}. 3f01150d30482ed76f3efc2cc207ab62eefb4b45 Template:Disambiguation (wiki.gg) 10 105 1181 127 2025-08-22T09:27:21Z Sharparam 284703 Sharparam renamed page [[Template:Disambiguation]] to [[Template:Disambiguation (wiki.gg)]] without leaving a redirect: Switching to a version more similar to WP's Disambiguation template wikitext text/x-wiki <includeonly><!-- -->{{#vardefine:topic|<!-- start vd -->{{#if:{{{topic|}}} | {{{topic}}} | {{PAGENAME}} }}<!-- end if -->}}<!-- end vd -->{{#vardefine:disambig|<!-- start vd -->{{#if:{{{1|}}}<!-- start custom disambig if -->|{{{1}}}<!-- start label if -->{{#if:{{{2|}}} | {{!}}{{{2}}} }}<!-- end label if -->|{{#var:topic}} (disambiguation)<!-- else; use regular disambig -->}}<!-- end custom disambig if -->}}<!-- end vd -->{{Hatnote|<!-- -->This page is about '''{{#var:topic}}'''. For other uses, see [[{{#var:disambig}}]].<!-- -->|icon=Disambig.svg<!-- -->}}<!-- --></includeonly><!-- --><noinclude>{{doc}}[[Category:Hatnote templates]]</noinclude> c4c62e7a1876492eb970ea182cf4ac0bcad97913 Template:Disambiguation (wiki.gg)/doc 10 104 1182 126 2025-08-22T09:27:21Z Sharparam 284703 Sharparam renamed page [[Template:Disambiguation/doc]] to [[Template:Disambiguation (wiki.gg)/doc]] without leaving a redirect: Switching to a version more similar to WP's Disambiguation template wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Disambiguation Page", "description": "A custom disambiguation page name.", "example": "Disambiguation Page", "type": "wiki-page-name" }, "2": { "label": "Link Label", "description": "A label for the custom disambiguation page.", "example": "Alternative Page Name", "type": "line" }, "topic": { "label": "Custom Topic", "description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic", "example": "a custom topic", "default": "{{PAGENAME}}", "type": "line" } }, "description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.", "paramOrder": [ "1", "2", "topic" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Disambiguation}}</nowiki></code> || {{Disambiguation|topic=Example}} |- | <code><nowiki>{{Disambiguation|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation|Special:Random|topic=Example}} |- | <code><nowiki>{{Disambiguation|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation|Special:Random|Page Label|topic=this particular topic}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]]. <noinclude>[[Category:Template documentation]]</noinclude> 5fce9c689120c57454571ff0e60a2cd447df5713 1185 1182 2025-08-22T09:30:40Z Sharparam 284703 Fix examples wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Disambiguation Page", "description": "A custom disambiguation page name.", "example": "Disambiguation Page", "type": "wiki-page-name" }, "2": { "label": "Link Label", "description": "A label for the custom disambiguation page.", "example": "Alternative Page Name", "type": "line" }, "topic": { "label": "Custom Topic", "description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic", "example": "a custom topic", "default": "{{PAGENAME}}", "type": "line" } }, "description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.", "paramOrder": [ "1", "2", "topic" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Disambiguation (wiki.gg}}</nowiki></code> || {{Disambiguation (wiki.gg)|topic=Example}} |- | <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|topic=Example}} |- | <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]]. <noinclude>[[Category:Template documentation]]</noinclude> 66a58f9b7bd1fcafab8c196a7f377e84c344bd01 1186 1185 2025-08-22T09:30:59Z Sharparam 284703 /* Examples */ Fix missing paren in example wikitext text/x-wiki <templatedata> { "params": { "1": { "label": "Disambiguation Page", "description": "A custom disambiguation page name.", "example": "Disambiguation Page", "type": "wiki-page-name" }, "2": { "label": "Link Label", "description": "A label for the custom disambiguation page.", "example": "Alternative Page Name", "type": "line" }, "topic": { "label": "Custom Topic", "description": "In case {{PAGENAME}} does not describe the topic, this can be used to display a custom topic", "example": "a custom topic", "default": "{{PAGENAME}}", "type": "line" } }, "description": "This hatnote template is meant to be used at the top of an article to indicate the existence of a disambiguation page.", "paramOrder": [ "1", "2", "topic" ], "format": "inline" } </templatedata> == Examples == {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{Disambiguation (wiki.gg)}}</nowiki></code> || {{Disambiguation (wiki.gg)|topic=Example}} |- | <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|topic=Example}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|topic=Example}} |- | <code><nowiki>{{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}}</nowiki></code> || {{Disambiguation (wiki.gg)|Special:Random|Page Label|topic=this particular topic}} |} == Dependencies == For this template to work properly, you need the following: * The {{tl|Hatnote}} base template. * The <code>.hatnote</code> class, found in [[MediaWiki:Common.css]]. == Source == Roughly based on [[wikipedia:Template:About|Wikipedia's About Template]]. <noinclude>[[Category:Template documentation]]</noinclude> b603298f6af054c214e7459e026fa92f9ff23fc2 Template:Disambiguation 10 764 1183 2025-08-22T09:27:49Z Sharparam 284703 Heavily simplified form of [[wikipedia:Template:Disambiguation]] wikitext text/x-wiki <includeonly>{{#if:{{NAMESPACE}}||[[Category:Disambiguation pages]]}}</includeonly><noinclude>{{Documentation}}</noinclude> f54474067961aa4345e7a2b4d76d7bf1334f39f9 1188 1183 2025-08-22T09:36:31Z Sharparam 284703 Add disambiguation magic word wikitext text/x-wiki <includeonly> {{#if:{{NAMESPACE}}| |__DISAMBIG__ [[Category:Disambiguation pages]] }} </includeonly><noinclude>{{Documentation}}</noinclude> e47f8fb1d8dcf2b726b5a0246e8a356dad403d06 Template:Disambiguation/doc 10 765 1184 2025-08-22T09:29:42Z Sharparam 284703 Created page with "Place at the end of disambiguation pages to put them in the proper category. == Usage == {{tl|Disambiguation}} <includeonly>{{Sandbox other||[[Category:Disambiguation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Place at the end of disambiguation pages to put them in the proper category. == Usage == {{tl|Disambiguation}} <includeonly>{{Sandbox other||[[Category:Disambiguation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 5c29d2096ac5de472ee1486183db375da0b06bad Category:Disambiguation pages 14 766 1187 2025-08-22T09:33:15Z Sharparam 284703 Created page with "Pages that serve to disambiguate topics/names that have multiple meanings. Places pages into this category by using the {{tl|Disambiguation}} template on a page. == External links == * [[:wikipedia:Category:Disambiguation pages|Disambiguation pages category]] on Wikipedia." wikitext text/x-wiki Pages that serve to disambiguate topics/names that have multiple meanings. Places pages into this category by using the {{tl|Disambiguation}} template on a page. == External links == * [[:wikipedia:Category:Disambiguation pages|Disambiguation pages category]] on Wikipedia. 645e1e0deadd54cd5f0aabe5da7a6a5bc838077d Template:Infobox/Armor 10 453 1189 1069 2025-08-22T09:39:48Z Sharparam 284703 Add special handling for librarian armor set wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helmet = [[Helmet]] | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard = [[Legguard]] | gauntlet = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}} | librarian = [[Librarian (armor set)|Librarian]] | #default = [[{{{Set}}}]] }}}}}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> d407ded1b1e4484c38086c6409349aed6462786a 1190 1189 2025-08-22T09:40:40Z Sharparam 284703 Fix misplaces braces wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helmet = [[Helmet]] | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard = [[Legguard]] | gauntlet = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}}}} | librarian = [[Librarian (armor set)|Librarian]] | #default = [[{{{Set}}}]] }}}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 018b792ce369ad673cb81326c20732f36e2f4e23 Template:Infobox/Item 10 417 1191 892 2025-08-22T09:43:36Z Sharparam 284703 Add support for materials wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | title={{{title|{{PAGENAME}}}}} | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{Main other|{{#switch:{{lc:{{{type|}}}}} | essential = [[Category:Essential items]] | upgrade = [[Category:Upgrade items]] | material = [[Category:Materials]] | #default = [[Category:Items]] }}}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> b03b79686bba1206934eab541c6768639949c1cc Gingko Leaves 0 433 1192 629 2025-08-22T09:44:04Z Sharparam 284703 Add infobox wikitext text/x-wiki {{Infobox/Item | type = material | image = Gingko Leaves.png }} '''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]]. == Acquisition == Drops from several enemies in the game, as well as found on the ground in certain locations. == Locations == {| class="wikitable" ! Amount !! Area !! Description !! Coordinates |- | 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}} |} {{Navbox/Materials}} [[Category:Materials]] 8533bbd6a3afd00d66170a3d89e01407aa5e92ed 1193 1192 2025-08-22T09:44:16Z Sharparam 284703 Remove unnecessary manual category wikitext text/x-wiki {{Infobox/Item | type = material | image = Gingko Leaves.png }} '''{{PAGENAME}}''' is a [[Materials|material]] found in {{BFF}} used in [[crafting]]. == Acquisition == Drops from several enemies in the game, as well as found on the ground in certain locations. == Locations == {| class="wikitable" ! Amount !! Area !! Description !! Coordinates |- | 2 || [[Deluge]] || Found at the end of the platform before the bridge leading into the big rectangular structures with pillars. || {{coords|-4541|-1823|5552}} |} {{Navbox/Materials}} e55300c158c70d2316f245ac6f97b1ac0490b1bd File:Gingko Leaves.png 6 767 1194 2025-08-22T09:46:01Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/food__95_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/food__95_ }} == Licensing == {{License|game}} bb157c358311d9b1cdc8004bfa38c9b860dfa85b Helmets 0 768 1195 2025-08-22T09:47:41Z Sharparam 284703 Created page with "'''Helmets''' is armor worn on the head in {{BFF}}. {{Navbox/Armor}} [[Category:Helmets]]" wikitext text/x-wiki '''Helmets''' is armor worn on the head in {{BFF}}. {{Navbox/Armor}} [[Category:Helmets]] eb0f2e082e86b23efbaa2d5aa01598c47acf0423 Pauldrons 0 769 1196 2025-08-22T09:48:03Z Sharparam 284703 Created page with "'''Pauldrons''' is armor worn on the shoulders in {{BFF}}. {{Navbox/Armor}} [[Category:Pauldrons]]" wikitext text/x-wiki '''Pauldrons''' is armor worn on the shoulders in {{BFF}}. {{Navbox/Armor}} [[Category:Pauldrons]] 5fda269f272af445bff53a01c65c204739af1494 Category:Pauldrons 14 770 1197 2025-08-22T09:48:16Z Sharparam 284703 Created page with "[[Category:Armor]]" wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Chestguards 0 771 1198 2025-08-22T09:48:42Z Sharparam 284703 Created page with "'''Chestguards''' is armor worn on the chest/torso in {{BFF}}. {{Navbox/Armor}} [[Category:Armor]]" wikitext text/x-wiki '''Chestguards''' is armor worn on the chest/torso in {{BFF}}. {{Navbox/Armor}} [[Category:Armor]] b5d8ee02000893e7cd4da78ac4eadde3635bda6e Chestguards 0 771 1199 1198 2025-08-22T09:48:53Z Sharparam 284703 Fix wrong category wikitext text/x-wiki '''Chestguards''' is armor worn on the chest/torso in {{BFF}}. {{Navbox/Armor}} [[Category:Chestguards]] ae282ffa9370d4795c6d2f312f06ec1d23474018 Legguards 0 772 1200 2025-08-22T09:49:20Z Sharparam 284703 Created page with "'''Legguards''' is armor worn on the legs in {{BFF}}. {{Navbox/Armor}} [[Category:Legguards]]" wikitext text/x-wiki '''Legguards''' is armor worn on the legs in {{BFF}}. {{Navbox/Armor}} [[Category:Legguards]] b808da558f41bba9aa569af4ea8900afd620cdcd Gauntlets 0 773 1201 2025-08-22T09:49:44Z Sharparam 284703 Created page with "'''Gauntlets''' is armor worn on the hands in {{BFF}}. {{Navbox/Armor}} [[Category:Gauntlets]]" wikitext text/x-wiki '''Gauntlets''' is armor worn on the hands in {{BFF}}. {{Navbox/Armor}} [[Category:Gauntlets]] 8905bf0ba5f2a4d97cd126387f0907c9b0c14b5e Category:Gauntlets 14 774 1202 2025-08-22T09:49:56Z Sharparam 284703 Created page with "[[Category:Armor]]" wikitext text/x-wiki [[Category:Armor]] 8dbf198b5dcaa87a18100850cc78880444b773ad Armor sets 0 775 1203 2025-08-22T09:51:28Z Sharparam 284703 Created page with "'''Armor sets''' are collections of armor pieces that fit together and share common names. They do not give any additional or special stats or bonuses for wearing multiple from the same set. {{Navbox/Armor}} [[Category:Armor sets]]" wikitext text/x-wiki '''Armor sets''' are collections of armor pieces that fit together and share common names. They do not give any additional or special stats or bonuses for wearing multiple from the same set. {{Navbox/Armor}} [[Category:Armor sets]] 8010451533ab61de5a922f98b8d3e3a1448d8263 Category:Dual Wields 14 469 1204 887 2025-08-22T09:52:32Z Sharparam 284703 Remove unnecessary grandparent category wikitext text/x-wiki [[Category:Two-handed weapons]] 797f628182636dd7d53e09a5330ca3c8e98ffe59 Template:Navbox/Consumables 10 286 1205 330 2025-08-22T09:55:57Z Sharparam 284703 Add [[Improved Diver's Lungs Concoction]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] | group2 = Fluids | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Regenerative Fluid]] * [[Restorative Fluid]] | group3 = Concoctions | list3 = * [[Diver's Lungs Concoction]] * [[Improved Diver's Lungs Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Mighty Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Concoction: Zealot's Tears]] * [[Experience Concoction]] * [[Mystery Concoction]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ac97c6dea70846027e525cba958dc4134b76f93e 1234 1205 2025-08-22T23:30:01Z Sharparam 284703 Add links to fluids and concoctions wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] | group2 = [[Fluids]] | list2 = * [[Greater Ionization Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Regenerative Fluid]] * [[Restorative Fluid]] | group3 = [[Concoctions]] | list3 = * [[Diver's Lungs Concoction]] * [[Improved Diver's Lungs Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Fluxshield Concoction]] * [[Jaeger's Concoction]] * [[Greater Jaeger's Concoction]] * [[Dreadguard's Concoction]] * [[Greater Dreadguard's Concoction]] * [[Technomancer's Concoction]] * [[Greater Technomancer's Concoction]] * [[Forsaken Concoction]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Health Regen]] * [[Concoction: Flux Regen]] * [[Concoction: Mighty Regen]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Agility]] * [[Concoction: Constitution]] * [[Concoction: Intelligence]] * [[Concoction: All Attributes]] * [[Concoction: Zealot's Tears]] * [[Experience Concoction]] * [[Mystery Concoction]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 143073e2e8ef425ae4d6f6aa288ab2d4ee4c65c2 Improved Diver's Lungs Concoction 0 744 1206 1149 2025-08-22T09:56:38Z Sharparam 284703 Add more information wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Recipe == Obtained by defeating the many-legged creature in [[Deluge]]. {{Navbox/Consumables}} [[Category:Concoctions]] 6d7f860f0a4d166821ac9c9f45485fb606abbd78 1229 1206 2025-08-22T23:05:17Z Sharparam 284703 Add infobox wikitext text/x-wiki {{Infobox/Item | image = Improved Diver's Lungs Concoction.png | type = concoction | Description = Increases maximum lung capacity by {{Duration|s=60|display=60 seconds}} worth of oxygen for {{Duration|s=600|display=600 seconds}}. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] [[Concoctions|concoction]] in {{BFF}}. == Recipe == Obtained by defeating the many-legged creature in [[Deluge]]. {{Navbox/Consumables}} 125ca95a7c845f9d99dc176f7ee336c9eff24a8e File:Eris.png 6 776 1207 2025-08-22T21:44:24Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_CrystalBall }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_CrystalBall }} == Licensing == {{License|game}} 13791c85c8308f9808f3678aec68d1b5bc0eca95 Eris 0 495 1208 755 2025-08-22T21:45:13Z Sharparam 284703 Add trivia about internal name wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Eris.png | Type = Helmet | Weight = Light | Passives = Flux Efficiency | Mk5_Sharp = 730 | Mk5_Blunt = 730 | Mk5_Technomancy = 939 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|2860|-4261|1423}} Found in [[Uranopolis#Tower Complex|Uranopolis (Tower Complex)]]. Nestled between some round pillars. == Trivia == * In the game files this helmet is called "Crystal Ball". {{Navbox/Armor}} 982b1d7218dccd34133cfadfa4d01d6c42d78782 File:Crude Helmet.png 6 777 1209 2025-08-22T21:46:29Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator2 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator2 }} == Licensing == {{License|game}} 7be523c7e5452991401a644cf5c2c1aeb23fd06d Crude Helmet 0 489 1210 743 2025-08-22T21:47:01Z Sharparam 284703 Add trivia about internal name wikitext text/x-wiki {{Infobox/Armor | image = Crude Helmet.png | title = {{PAGENAME}} | Type = Helmet | Weight = Medium | Mk2_Sharp = 516 | Mk2_Blunt = 600 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] type of [[armor]] that can be found in {{BFF}}. == Location == {{coords|-3538|-6027|5477}} Found in [[Deluge|the Deluge]] area. After reaching the bottom of the big broken tower (where [[Folk Cape]] and [[Dust Sea|the Dust Sea]] can be found), continue right and follow the wall until you see a a corpse on a ledge holding the item. == Trivia == * In the game files this helmet is called "Respirator 2". {{Navbox/Armor}} b994e21072eccbe0a11ea0897cfb76d018531488 File:Deserts Respirator Helmet.png 6 778 1211 2025-08-22T21:48:21Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator3 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/Icon_Respirator3 }} == Licensing == {{License|game}} 943066b823dd97a699939deee1bd079a3458703f Deserts Respirator Helmet 0 492 1212 749 2025-08-22T21:48:50Z Sharparam 284703 Add trivia about internal name wikitext text/x-wiki {{Infobox/Armor | title = {{PAGENAME}} | image = Deserts Respirator Helmet.png | Type = helmet | Weight = Medium | Mk2_Sharp = 545 | Mk2_Blunt = 633 | Mk2_Technomancy = 336 }} '''{{PAGENAME}}''' is a [[Helmets|helmet]] in {{BFF}}. == Location == {{coords|1367|6630|-1395}} Found in the [[Desert]]. Located on a corpse near the portal to [[Desert Mirage]]. == Trivia == * In the game files this helmet is called "Respirator 3". {{Navbox/Armor}} 1e5cfba9361c3caecb26137e38805596bed59fd6 File:Citadel Warrior.png 6 779 1213 2025-08-22T22:01:46Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Librarian.png 6 780 1214 2025-08-22T22:22:08Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Sentinel.png 6 781 1215 2025-08-22T22:24:24Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Vengeance.png 6 782 1216 2025-08-22T22:25:59Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Mobius Blade 0 666 1217 1027 2025-08-22T22:30:26Z Sharparam 284703 Add item description wikitext text/x-wiki {{Infobox/Item | type = essential | image = Mobius Blade.png | Description = An enigmatic relic – a shimmering blade with immense and inexplicable power that operates in ways beyond conventional comprehension. The word Mobius is inscribed in its hilt. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Overview == The player can use the blade to kill themselves, allowing them to respawn at the [[homunculus]] they last saved their position at (or a [[Homunculus Mirage]]). {{Navbox/Essential items}} afd465d1ec5470c335393e767cb4fc666b131fe2 File:Perk Essence.png 6 783 1218 2025-08-22T22:32:09Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_21 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_21 }} == Licensing == {{License|game}} 2e7311f76def2a759f1e8023d70c2d23a892e4eb File:Unstable Perk Essence.png 6 784 1219 2025-08-22T22:32:47Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_24 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_24 }} == Licensing == {{License|game}} 8e91bbce8b005be8e383d57d306ccd2b46305482 File:Plagued Blood.png 6 785 1220 2025-08-22T22:34:39Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_50 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_50 }} == Licensing == {{License|game}} cec79d0946a981f402df171aee3c18f864c078ec Anomalous Fragment 0 426 1221 615 2025-08-22T22:35:59Z Sharparam 284703 Set type in infobox and add navbox wikitext text/x-wiki {{Infobox/Item | type = essential | title = {{PAGENAME}} | image = Anomalous Fragment.png | Description = [[The Handler|Handler]] may convert it to a more useful form. }} '''{{PAGENAME}}''' is an [[Essential items|essential item]] in {{BFF}}. == Acquisition == Drops from [[bosses]] in [[NG+]]. == Usage == Used to manufacture [[Greater Anomalous Crystal|Greater Anomalous Crystals]] at [[The Handler]]. {{Navbox/Essential items}} 1d2150fe8c156d69c0f502eab860d67c2c37ee99 Template:Navbox/Essential items 10 663 1222 1023 2025-08-22T22:36:27Z Sharparam 284703 Add [[Anomalous Fragment]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Essential items | title = [[Essential items]] | list1 = * [[Ability Splinter]] * [[Anomalous Fragment]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] }}<noinclude>{{Documentation}}</noinclude> b6acc68ad0aba7b49cdce6e0674bae9ec26fe22d File:Anomalous Fragment.png 6 786 1223 2025-08-22T22:37:10Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_11 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRunes/256x256/ClassicRunes_11 }} == Licensing == {{License|game}} e783567ca742b544e6f91ab052f3d7ea549145b6 Category:Concoctions 14 787 1224 2025-08-22T22:38:29Z Sharparam 284703 Created page with "[[Category:Consumables]]" wikitext text/x-wiki [[Category:Consumables]] 193ccd7fd91966b7687713ee56f8a8ec4b51e614 Category:Consumables 14 788 1225 2025-08-22T22:38:43Z Sharparam 284703 Created page with "[[Category:Items]]" wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Template:Infobox/Item 10 417 1226 1191 2025-08-22T22:40:15Z Sharparam 284703 Add support for consumables, fluids, and concoctions wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | title={{{title|{{PAGENAME}}}}} | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{Main other|{{#switch:{{lc:{{{type|}}}}} | essential = [[Category:Essential items]] | upgrade = [[Category:Upgrade items]] | material = [[Category:Materials]] | consumable = [[Category:Consumables]] | fluid = [[Category:Fluids]] | concoction = [[Category:Concoctions]] | #default = [[Category:Items]] }}}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> 893d7291a9f8b061cc61e1758dcd1198d548dc65 Template:Infobox/Item/doc 10 464 1227 693 2025-08-22T22:56:16Z Sharparam 284703 Add TemplateData wikitext text/x-wiki == TemplateData == <templatedata> { "description": "Infobox used for items of various kinds that don't have a specialized infobox.", "format": "block", "params": { "title": { "label": "Title", "description": "Title/name of the item. If not given it will use the name of the page the infobox is used on (usually results in the desired name).", "type": "line", "required": false, "default": "{{PAGENAME}}", "example": "Health Potion" }, "image": { "label": "Image", "description": "Game image for the item.", "type": "wiki-file-name", "required": true, "example": "Health Potion.png" }, "type": { "label": "Type", "description": "Item type. Supported values are 'consumable', 'essential', 'upgrade', 'material', 'fluid', and 'concoction'. Other values or not specifying it makes the infobox fallback to treating it as a generic item. Even for generic items, it is recommended to supply this parameter and simply specify it as 'item'.", "type": "line", "required": false, "suggested": true, "default": "item", "example": "consumable", "suggestedvalues": [ "item", "concoction", "consumable", "essential", "fluid", "material", "upgrade" ] }, "Description": { "label": "Description", "description": "In-game description of the item, if available. Do not use this field for your own description of an item, that belongs in the article body instead.", "type": "string", "required": false, "example": "Restores a portion of your health." } } } </templatedata> == Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | type = consumable | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | type = consumable | Description = This item will do something fancy when you use it! }} </syntaxhighlight> ca8b0fcbede569135444bbac9669e398fa06f6a2 Template:Duration/doc 10 789 1228 2025-08-22T23:02:45Z Sharparam 284703 Created page with "== Examples == * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> &rarr; {{Duration|3:30}} * <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> &rarr; {{Duration|h=1|m=2|s=3}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> &rarr; {{Duration|3|2|1}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> &rarr; {{Duration|3:30:00..." wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> &rarr; {{Duration|3:30}} * <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> &rarr; {{Duration|h=1|m=2|s=3}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> &rarr; {{Duration|3|2|1}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> &rarr; {{Duration|3:30:00|display=A really long time!}} * <syntaxhighlight lang="wikitext" inline>{{Duration|PT3H30M12S}}</syntaxhighlight> &rarr; {{Duration|PT3H30M12S}} d920850f2db2a205afa2cefb501d9231c694b609 Concoctions 0 790 1230 2025-08-22T23:07:28Z Sharparam 284703 Created page with "'''Concoctions''' are a type of [[Consumables|consumable]] in {{BFF}}. While [[fluids]] give instant restoration or short duration buffs, concoctions tend to give buffs like stat increases for a longer period of time. {{Navbox/Consumables}} [[Category:Concoctions]]" wikitext text/x-wiki '''Concoctions''' are a type of [[Consumables|consumable]] in {{BFF}}. While [[fluids]] give instant restoration or short duration buffs, concoctions tend to give buffs like stat increases for a longer period of time. {{Navbox/Consumables}} [[Category:Concoctions]] 4f232b80e8f16735421b1daa0047d19dfd388747 File:Improved Diver's Lungs Concoction.png 6 791 1231 2025-08-22T23:08:14Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_56 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_56 }} == Licensing == {{License|game}} b1b2ea2d8e30048616cf00a2afa76912557f63b8 Module:Duration 828 412 1232 585 2025-08-22T23:18:53Z Sharparam 284703 Improve parsing of duration Scribunto text/plain ---Duration module ---@module DurationModule ---@alias p local getArgs = require('Module:Arguments').getArgs local ARG_OPTS = { wrappers = { "Template:Duration" } } ---@class Duration ---@field h ---@field m ---@field s ---@type Duration local ZERO = { h = 0, m = 0, s = 0 } ---@type int[][] local LOOKUP = { [1] = { 0, 0, 1 }, [2] = { 0, 1, 2 }, [3] = { 1, 2, 3 } } local p = {} ---@param args any ---@return Duration local function parseDuration(args) local h = tonumber(args.h or args[1]) local m = tonumber(args.m or args[2]) local s = tonumber(args.s or args[3]) if h or m or s then h = h or 0 m = m or 0 s = s or 0 else local input = args[1] if not input or input == "" then return ZERO end local parts = {} for part in string.gmatch(input, "%d+") do parts[#parts + 1] = tonumber(part) or 0 end local size = #parts h = parts[LOOKUP[size][1]] or 0 m = parts[LOOKUP[size][2]] or 0 s = parts[LOOKUP[size][3]] or 0 end local seconds = h * 60 * 60 + m * 60 + s local hours = math.floor(total_seconds / 60 / 60) seconds = seconds - hours * 60 * 60 local minutes = math.floor(total_seconds / 60) seconds = seconds - minutes * 60 return { h = hours, m = minutes, s = seconds } --[[@as Duration]] end ---@param duration Duration ---@return string local function toisostring(duration) return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s) end ---@param duration Duration ---@return string local function todisplaystring(duration) if duration.h > 0 then return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s) end return string.format("%02d:%02d", duration.m, duration.s) end ---@param frame any ---@return any function p.main(frame) local args = getArgs(frame, ARG_OPTS) return p._main(args, function(s) return frame:preprocess(s) end) end function p._main(args, preprocess) preprocess = preprocess or function(s) return s end local duration = parseDuration(args) local iso = toisostring(duration) local display local is_custom_display = false if args.display then display = preprocess(args.display) is_custom_display = true else display = todisplaystring(duration) end local elem = mw.html.create('time') :attr('datetime', iso) :addClass('duration') :wikitext(display) if is_custom_display then elem:attr('title', todisplaystring(duration)) :addClass('dotted') end return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Duration/styles.css' } } .. tostring(elem) end return p 03ec8d76a08d2df423bef69d7af5c53b74fe7036 1233 1232 2025-08-22T23:21:26Z Sharparam 284703 Fix typo Scribunto text/plain ---Duration module ---@module DurationModule ---@alias p local getArgs = require('Module:Arguments').getArgs local ARG_OPTS = { wrappers = { "Template:Duration" } } ---@class Duration ---@field h ---@field m ---@field s ---@type Duration local ZERO = { h = 0, m = 0, s = 0 } ---@type int[][] local LOOKUP = { [1] = { 0, 0, 1 }, [2] = { 0, 1, 2 }, [3] = { 1, 2, 3 } } local p = {} ---@param args any ---@return Duration local function parseDuration(args) local h = tonumber(args.h or args[1]) local m = tonumber(args.m or args[2]) local s = tonumber(args.s or args[3]) if h or m or s then h = h or 0 m = m or 0 s = s or 0 else local input = args[1] if not input or input == "" then return ZERO end local parts = {} for part in string.gmatch(input, "%d+") do parts[#parts + 1] = tonumber(part) or 0 end local size = #parts h = parts[LOOKUP[size][1]] or 0 m = parts[LOOKUP[size][2]] or 0 s = parts[LOOKUP[size][3]] or 0 end local seconds = h * 60 * 60 + m * 60 + s local hours = math.floor(seconds / 60 / 60) seconds = seconds - hours * 60 * 60 local minutes = math.floor(seconds / 60) seconds = seconds - minutes * 60 return { h = hours, m = minutes, s = seconds } --[[@as Duration]] end ---@param duration Duration ---@return string local function toisostring(duration) return string.format("PT%dH%dM%dS", duration.h, duration.m, duration.s) end ---@param duration Duration ---@return string local function todisplaystring(duration) if duration.h > 0 then return string.format("%02d:%02d:%02d", duration.h, duration.m, duration.s) end return string.format("%02d:%02d", duration.m, duration.s) end ---@param frame any ---@return any function p.main(frame) local args = getArgs(frame, ARG_OPTS) return p._main(args, function(s) return frame:preprocess(s) end) end function p._main(args, preprocess) preprocess = preprocess or function(s) return s end local duration = parseDuration(args) local iso = toisostring(duration) local display local is_custom_display = false if args.display then display = preprocess(args.display) is_custom_display = true else display = todisplaystring(duration) end local elem = mw.html.create('time') :attr('datetime', iso) :addClass('duration') :wikitext(display) if is_custom_display then elem:attr('title', todisplaystring(duration)) :addClass('dotted') end return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Duration/styles.css' } } .. tostring(elem) end return p 1e05aa6ebf1e3a52baee275fe149a5e5b80d51c5 Fluids 0 792 1235 2025-08-22T23:31:32Z Sharparam 284703 Created page with "'''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats. {{Navbox/Consumables}}" wikitext text/x-wiki '''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats. {{Navbox/Consumables}} f032454331c9c43545909d07ee277b137f8372e1 1236 1235 2025-08-22T23:31:42Z Sharparam 284703 Add category wikitext text/x-wiki '''Fluids''' are a type of [[Consumables|consumable]] in {{BFF}}. They typically give instant restoration of resources like [[health]] and [[flux]], or a short buff that restores it over time, unlike [[concoctions]] that tend to give longer buffs to stats. {{Navbox/Consumables}} [[Category:Fluids]] 88b1f660d7f977146d02c2dc2713d8f2d220f19f Category:Fluids 14 793 1237 2025-08-22T23:31:56Z Sharparam 284703 Created page with "[[Category:Consumables]]" wikitext text/x-wiki [[Category:Consumables]] 193ccd7fd91966b7687713ee56f8a8ec4b51e614 Materials 0 431 1238 625 2025-08-22T23:36:27Z Sharparam 284703 Add acquisition notes wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. == Acquisition == Materials are dropped by enemies or found on the ground. [[Essence|Essences]] can also be extracted from [[Anomalous Crystals]], although it requires destroying the crystal. {{Navbox/Materials}} 54925fc2f73f55d978246de626db57b71ee98da4 1243 1238 2025-08-22T23:46:12Z Sharparam 284703 Add info on UI quirks wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] used to [[Crafting|craft]] or [[Manufacturing|manufacture]] other items. == Overview == After collecting more than 999 of a material, the inventory will simply show the count as "999+". To see the actual amount of the material, go to the crafting tab and look at an item that uses it in its recipe. == Acquisition == Materials are dropped by enemies or found on the ground. [[Essence|Essences]] can also be extracted from [[Anomalous Crystals]], although it requires destroying the crystal. {{Navbox/Materials}} 16c03274cbdefa879852d2add32a15681dc36535 Essence 0 794 1239 2025-08-22T23:40:05Z Sharparam 284703 Created page with "{{Infobox/Item | image = Essence.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Can be extracted from [[Anomalous crystals]], destroying the crystal in the process. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Essence.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Can be extracted from [[Anomalous crystals]], destroying the crystal in the process. {{Navbox/Materials}} 89adde888d87bb8704953166b5a42b3da2da95c5 File:Essence.png 6 795 1240 2025-08-22T23:40:45Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/lantern__10_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/lantern__10_ }} == Licensing == {{License|game}} 1822b1d8229259ef1d6c5275b994fad589558960 Sludge 0 796 1241 2025-08-22T23:43:52Z Sharparam 284703 Created page with "{{Infobox/Item | image = Sludge.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Dropped by enemies and found on the ground in certain locations. Compared to other materials, sludge is very plentiful and a player is likely to have thousands of it while only having dozens or hundreds of other materials. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Sludge.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. == Acquisition == Dropped by enemies and found on the ground in certain locations. Compared to other materials, sludge is very plentiful and a player is likely to have thousands of it while only having dozens or hundreds of other materials. {{Navbox/Materials}} db6f64f0e318a3fef7e2730138aac402316df24c File:Sludge.png 6 797 1242 2025-08-22T23:44:24Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/goldpile__3_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/goldpile__3_ }} == Licensing == {{License|game}} 9ea5dcd2eae75a87ae6111f20d1f12be6504c498 Fractal Fungus 0 798 1244 2025-08-23T00:38:08Z Sharparam 284703 Created page with "{{Infobox/Item | image = Fractal Fungus.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Fractal Fungus.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} 605f3cf626e7517db3043a7f06c86c76de08e1f9 Gravicle Dust 0 799 1245 2025-08-23T00:38:27Z Sharparam 284703 Created page with "{{Infobox/Item | image = Gravicle Dust.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Gravicle Dust.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} 860212f45dfe29e748e9794188e92c013a052bdd Machinite 0 800 1246 2025-08-23T00:38:38Z Sharparam 284703 Created page with "{{Infobox/Item | image = Machinite.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Machinite.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} e1d39616d0055f9ba158fb4e237c2c665ae90cc6 Neurilium 0 801 1247 2025-08-23T00:38:54Z Sharparam 284703 Created page with "{{Infobox/Item | image = Neurilium.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Neurilium.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} e2a91027e9404b8aef5aae8792babcd1c717437c Rustvine 0 802 1248 2025-08-23T00:39:05Z Sharparam 284703 Created page with "{{Infobox/Item | image = Rustvine.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Rustvine.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} e4bb7f054f0694d1bd88a934d6eab29383826649 Spectral Ash 0 803 1249 2025-08-23T00:39:15Z Sharparam 284703 Created page with "{{Infobox/Item | image = Spectral Ash.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}}" wikitext text/x-wiki {{Infobox/Item | image = Spectral Ash.png | type = material }} '''{{PAGENAME}}''' is a [[crafting]] [[Materials|material]] in {{BFF}}. {{Navbox/Materials}} 79ee0d1ee2797a3b441ed037f13a4850be4c42e0 File:Gravicle Dust.png 6 804 1250 2025-08-23T00:40:32Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ingredient__20_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ingredient__20_ }} == Licensing == {{License|game}} d1957f752190c71a990c31b1cd3d067caddef177 File:Machinite.png 6 805 1251 2025-08-23T00:41:34Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ore__15_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ore__15_ }} == Licensing == {{License|game}} c2c900b1ef60bea290f7405aefd7e3bb314ca512 File:Neurilium.png 6 806 1252 2025-08-23T00:42:04Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ingredient__193_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ingredient__193_ }} == Licensing == {{License|game}} 37cc40dd2d2e96e3ec7f3366ec45bc45962f3ac9 File:Rustvine.png 6 807 1253 2025-08-23T00:42:31Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/food__99_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/food__99_ }} == Licensing == {{License|game}} a36bbaaa71585eaf4240caf83773d35bc7a59887 File:Spectral Ash.png 6 808 1254 2025-08-23T00:43:02Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ingredient__74_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ingredient__74_ }} == Licensing == {{License|game}} 59d0e0e8fc788687ecc5e368dd6640fe050d0685 File:Fractal Fungus.png 6 809 1255 2025-08-23T00:43:29Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ingredient__4_ }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ingredient__4_ }} == Licensing == {{License|game}} a5301c278a338e04b74203c2b2d0448ab3e8c3f0 Template:Navbox/Consumables 10 286 1256 1234 2025-08-23T00:52:44Z Sharparam 284703 Add more consumables wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Asylum Brew]] * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] * [[Piercing Arrow Pack]] | group2 = [[Fluids]] | list2 = * [[Greater Ionization Fluid]] * [[Greater Regenerative Fluid]] * [[Greater Restorative Fluid]] * [[Ionization Fluid]] * [[Lesser Ionization Fluid]] * [[Lesser Restorative Fluid]] * [[Mystery Concoction]] * [[Regenerative Fluid]] * [[Restorative Fluid]] | group3 = [[Concoctions]] | list3 = * [[Diver's Lungs Concoction]] * [[Dreadguard's Concoction]] * [[Experience Concoction]] * [[Fluxshield Concoction]] * [[Forsaken Concoction]] * [[Greater Dreadguard's Concoction]] * [[Greater Jaeger's Concoction]] * [[Greater Technomancer's Concoction]] * [[Improved Diver's Lungs Concoction]] * [[Indestructible Concoction]] * [[Jaeger's Concoction]] * [[Mystery Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Technomancer's Concoction]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Agility]] * [[Concoction: All Attributes]] * [[Concoction: Berserker's Tenacity]] * [[Concoction: Constitution]] * [[Concoction: Flux Regen]] * [[Concoction: Health Regen]] * [[Concoction: Intelligence]] * [[Concoction: Mighty Regen]] * [[Concoction: Powerful Immune System]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Zealot's Tears]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 0cf54c50606d4658229eeca534b614c602feb4ac Template:Navbox/Items 10 285 1257 1025 2025-08-23T00:54:59Z Sharparam 284703 Add ammunition wikitext text/x-wiki {{Navbox | template = Navbox/Items | title = [[Items]] | group1 = [[Essential items|Essential]] | list1 = {{Navbox/Essential items|child}} | group2 = [[Ammunition]] | list2 = {{Navbox/Ammunition|child}} | group3 = [[Anomalous crystals]] | list3 = {{Navbox/Anomalous crystals|child}} | group4 = [[Consumables]] | list4 = {{Navbox/Consumables|child}} | group5 = [[Equipment]] | list5 = {{Navbox/Equipment|child}} | group6 = [[Materials]] | list6 = {{Navbox/Materials|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 5153392b72f92ebc1a99e6f1772e7a128a25784e Template:Navbox/Ammunition 10 810 1258 2025-08-23T00:57:06Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | template = Navbox/Ammunition | title = [[Ammunition]] | list1 = * [[Metal Arrows]] * [[Piercing Arrow]] * [[Shock Arrows]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Ammunition | title = [[Ammunition]] | list1 = * [[Metal Arrows]] * [[Piercing Arrow]] * [[Shock Arrows]] }}<noinclude>{{Documentation}}</noinclude> f87d2ad23704598b8ed6727d82e1a6f74f671cf4 Template:Navbox/Ammunition/doc 10 811 1259 2025-08-23T00:57:40Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> a072d936de3f697ea20b212186fc4bf85674e635 Template:Navbox 10 45 1260 53 2025-08-23T00:59:19Z Sharparam 284703 Protected "[[Template:Navbox]]": Widely transcluded: Basic template used by all navbox templates. Edit the relevant specific navbox template instead. (Also, this simply calls the Lua module so there's little reason to edit this basic template.) ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki <includeonly>{{#invoke:Navbox|main}}</includeonly><noinclude>[[Category:Navigation templates]] {{documentation}}</noinclude> 11355a4514de8aa6c0ae686240591d267101c58c Template:Navbox/Essential items 10 663 1261 1222 2025-08-23T01:00:26Z Sharparam 284703 Add [[Broken Arrow]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Essential items | title = [[Essential items]] | list1 = * [[Ability Splinter]] * [[Anomalous Fragment]] * [[Broken Arrow]] * [[Handler Echo]] * [[Homunculus Mirage]] ([[Homunculus Mirage Husk|Husk]]) * [[Mobius Blade]] * [[Old Key]] * [[Perk Essence]] ([[Unstable Perk Essence|Unstable]]) * [[Plagued Blood]] * [[Scanner]] | group1.1 = [[Upgrade items|Upgrade]] | list1.1 = * [[Upgrade Splinter]] * [[Upgrade Module]] }}<noinclude>{{Documentation}}</noinclude> a0b32a5211b92c2883d548badf73e8b9a242bd79 Broken Arrow 0 812 1262 2025-08-23T01:02:40Z Sharparam 284703 Created page with "{{Infobox/Item | image = Broken Arrow.png | type = essential | Description = An even more common kind of arrow – a broken one. }} '''{{PAGENAME}}''' is an [[Items|item]] in {{BFF}}. Its only purpose is to be crafted into [[Metal Arrows]], at a rate of three broken arrows for one metal arrow. {{Navbox/Essential items}}" wikitext text/x-wiki {{Infobox/Item | image = Broken Arrow.png | type = essential | Description = An even more common kind of arrow – a broken one. }} '''{{PAGENAME}}''' is an [[Items|item]] in {{BFF}}. Its only purpose is to be crafted into [[Metal Arrows]], at a rate of three broken arrows for one metal arrow. {{Navbox/Essential items}} e31b3d8e33a64fbf4ee756f13613a02441313b11 File:Broken Arrow.png 6 813 1263 2025-08-23T01:03:05Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/BrokenArrow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/BrokenArrow }} == Licensing == {{License|game}} 2d63b0638f2ac03b835bb73d15bc884a05b8a2d5 Ammunition 0 814 1264 2025-08-23T01:04:47Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' are items that can be show with [[longbows]]. {{Navbox/Ammunition}} [[Category:Ammunition]]" wikitext text/x-wiki '''{{PAGENAME}}''' are items that can be show with [[longbows]]. {{Navbox/Ammunition}} [[Category:Ammunition]] bcca4dcdcefb3efa4007fae163ea1d5dcf5596dc Category:Ammunition 14 815 1265 2025-08-23T01:04:58Z Sharparam 284703 Created page with "[[Category:Items]]" wikitext text/x-wiki [[Category:Items]] 8bd3beebb2826830a9eade77bf73f03d8286ea27 Metal Arrows 0 816 1266 2025-08-23T01:06:39Z Sharparam 284703 Created page with "{{Infobox/Item | image = Metal Arrows.png | type = ammunition | Description = A common and replaceable projectile. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}}" wikitext text/x-wiki {{Infobox/Item | image = Metal Arrows.png | type = ammunition | Description = A common and replaceable projectile. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} cbe6a8a057aa88f1bce95efa8dd6063b69c77e33 1272 1266 2025-08-23T01:14:18Z Sharparam 284703 Add navbox for longbows wikitext text/x-wiki {{Infobox/Item | image = Metal Arrows.png | type = ammunition | Description = A common and replaceable projectile. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} 3c57de54bbddc8e4e2c1313ff2f80c6ed10435f3 File:Metal Arrows.png 6 817 1267 2025-08-23T01:07:03Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/Basicarrow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/Basicarrow }} == Licensing == {{License|game}} 2280dbdb249a77507d41195c58c5bb0d58a94202 Template:Infobox/Item 10 417 1268 1226 2025-08-23T01:07:47Z Sharparam 284703 Add support for [[Ammunition]] wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind=item | sep=, | title={{{title|{{PAGENAME}}}}} | image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=DescriptionSection | DescriptionSection=Description | DescriptionSection_label=Description | Description_nolabel=yes }}{{Main other|{{#switch:{{lc:{{{type|}}}}} | ammo | ammunition = [[Category:Ammunition]] | essential = [[Category:Essential items]] | upgrade = [[Category:Upgrade items]] | material = [[Category:Materials]] | consumable = [[Category:Consumables]] | fluid = [[Category:Fluids]] | concoction = [[Category:Concoctions]] | #default = [[Category:Items]] }}}}</includeonly><noinclude> {{Documentation}} [[Category:Infobox templates]]</noinclude> 15e673304251e5c68c7123d77ca24910b676c118 Template:Infobox/Item/doc 10 464 1269 1227 2025-08-23T01:08:16Z Sharparam 284703 Add doc for ammunition type wikitext text/x-wiki == TemplateData == <templatedata> { "description": "Infobox used for items of various kinds that don't have a specialized infobox.", "format": "block", "params": { "title": { "label": "Title", "description": "Title/name of the item. If not given it will use the name of the page the infobox is used on (usually results in the desired name).", "type": "line", "required": false, "default": "{{PAGENAME}}", "example": "Health Potion" }, "image": { "label": "Image", "description": "Game image for the item.", "type": "wiki-file-name", "required": true, "example": "Health Potion.png" }, "type": { "label": "Type", "description": "Item type. Supported values are 'ammunition', 'consumable', 'essential', 'upgrade', 'material', 'fluid', and 'concoction'. Other values or not specifying it makes the infobox fallback to treating it as a generic item. Even for generic items, it is recommended to supply this parameter and simply specify it as 'item'.", "type": "line", "required": false, "suggested": true, "default": "item", "example": "consumable", "suggestedvalues": [ "item", "ammunition", "concoction", "consumable", "essential", "fluid", "material", "upgrade" ] }, "Description": { "label": "Description", "description": "In-game description of the item, if available. Do not use this field for your own description of an item, that belongs in the article body instead.", "type": "string", "required": false, "example": "Restores a portion of your health." } } } </templatedata> == Examples == {{Infobox/Item | image = Fancy item.png | title = Fancy item | type = consumable | Description = This item will do something fancy when you use it! }} <syntaxhighlight lang="wikitext"> {{Infobox/Item | image = Fancy item.png | title = Fancy item | type = consumable | Description = This item will do something fancy when you use it! }} </syntaxhighlight> b7072508bd1ef0424021e2fd29e396de42abd452 Template:Navbox/Longbows 10 818 1270 2025-08-23T01:13:03Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Longbows | title = [[Longbows]] | list1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Longbows | title = [[Longbows]] | list1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged bow]] }}<noinclude>{{Documentation}}</noinclude> a52bb6aa077c6e7d02ee5f21a9d706b0ad698d7e Template:Navbox/Longbows/doc 10 819 1271 2025-08-23T01:13:35Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> a072d936de3f697ea20b212186fc4bf85674e635 Template:Navbox/Ranged weapons 10 820 1273 2025-08-23T01:17:39Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | group1 = [[Longbows]] | list1 = {{Navbox/Longbows|child}} | group2 = [[Staves]] | list2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | group1 = [[Longbows]] | list1 = {{Navbox/Longbows|child}} | group2 = [[Staves]] | list2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude> 6173db7c4376edf846d8951786b78f364a3ebc83 1274 1273 2025-08-23T01:18:17Z Sharparam 284703 Fix missing params wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Ranged weapons | title = [[Ranged weapons]] | group1 = [[Longbows]] | list1 = {{Navbox/Longbows|child}} | group2 = [[Staves]] | list2 = * [[Asklepios]] * [[Blessed Crosier]] * [[Evolved Staff]] * [[Mechanomad Staff]] * [[Vermillion Staff]] }}<noinclude>{{Documentation}}</noinclude> a00bcfa757ece76ed674698fb0404ad2f82a5788 Template:Navbox/Weapons 10 438 1275 1059 2025-08-23T01:18:56Z Sharparam 284703 Switch to child navbox for ranged weapons wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Crescent Axe]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] | group3 = [[Ranged weapons|Ranged]] | list3 = {{Navbox/Ranged weapons|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> cb065e4fb7e8abbaa07e27234536a0d85b22d837 Template:Navbox/Ranged weapons/doc 10 821 1276 2025-08-23T01:19:38Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> a072d936de3f697ea20b212186fc4bf85674e635 Piercing Arrow 0 822 1277 2025-08-23T01:20:47Z Sharparam 284703 Created page with "{{Infobox/Item | image = Piercing Arrow.png | type = ammunition | Description = A projectile that ignores up to 2000 armor rating. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}}" wikitext text/x-wiki {{Infobox/Item | image = Piercing Arrow.png | type = ammunition | Description = A projectile that ignores up to 2000 armor rating. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} ee55b68eda821ca46afd9433e29d4ca3626e7134 File:Piercing Arrow.png 6 823 1278 2025-08-23T01:21:22Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/PiercingArrow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/PiercingArrow }} == Licensing == {{License|game}} d15e7e54bdb589d6cf5e48b2ef48acb409190de0 Shock Arrows 0 824 1279 2025-08-23T01:22:53Z Sharparam 284703 Created page with "{{Infobox/Item | image = Shock Arrows.png | type = ammunition | Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}}" wikitext text/x-wiki {{Infobox/Item | image = Shock Arrows.png | type = ammunition | Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} d236e07c75607e37cacee19e8b7681057d8e4d11 File:Shock Arrows.png 6 825 1280 2025-08-23T01:23:19Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ShockArrow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ShockArrow }} == Licensing == {{License|game}} c34d8433913650912573eb234b0b0dc8a2c47818 Template:Hlist 10 826 1282 1281 2025-08-23T01:31:50Z Sharparam 284703 1 revision imported wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 9e3824c2e3c0e0dbef2f37556ac0b994987fecf9 Template:Hlist/styles.css 10 827 1284 1283 2025-08-23T01:31:51Z Sharparam 284703 1 revision imported sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 8c9dd9c9c00f30eead17fe10f51d183333e81f33 Module:List 828 828 1286 1285 2025-08-23T01:31:51Z Sharparam 284703 1 revision imported Scribunto text/plain local libUtil = require('libraryUtil') local checkType = libUtil.checkType local mTableTools = require('Module:TableTools') local p = {} local listTypes = { ['bulleted'] = true, ['unbulleted'] = true, ['horizontal'] = true, ['ordered'] = true, ['horizontal_ordered'] = true } function p.makeListData(listType, args) -- Constructs a data table to be passed to p.renderList. local data = {} -- Classes and TemplateStyles data.classes = {} data.templatestyles = '' if listType == 'horizontal' or listType == 'horizontal_ordered' then table.insert(data.classes, 'hlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Hlist/styles.css' } } elseif listType == 'unbulleted' then table.insert(data.classes, 'plainlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plainlist/styles.css' } } end table.insert(data.classes, args.class) -- Main div style data.style = args.style -- Indent for horizontal lists if listType == 'horizontal' or listType == 'horizontal_ordered' then local indent = tonumber(args.indent) indent = indent and indent * 1.6 or 0 if indent > 0 then data.marginLeft = indent .. 'em' end end -- List style types for ordered lists -- This could be "1, 2, 3", "a, b, c", or a number of others. The list style -- type is either set by the "type" attribute or the "list-style-type" CSS -- property. if listType == 'ordered' or listType == 'horizontal_ordered' then data.listStyleType = args.list_style_type or args['list-style-type'] data.type = args['type'] -- Detect invalid type attributes and attempt to convert them to -- list-style-type CSS properties. if data.type and not data.listStyleType and not tostring(data.type):find('^%s*[1AaIi]%s*$') then data.listStyleType = data.type data.type = nil end end -- List tag type if listType == 'ordered' or listType == 'horizontal_ordered' then data.listTag = 'ol' else data.listTag = 'ul' end -- Start number for ordered lists data.start = args.start if listType == 'horizontal_ordered' then -- Apply fix to get start numbers working with horizontal ordered lists. local startNum = tonumber(data.start) if startNum then data.counterReset = 'listitem ' .. tostring(startNum - 1) end end -- List style -- ul_style and ol_style are included for backwards compatibility. No -- distinction is made for ordered or unordered lists. data.listStyle = args.list_style -- List items -- li_style is included for backwards compatibility. item_style was included -- to be easier to understand for non-coders. data.itemStyle = args.item_style or args.li_style data.items = {} for _, num in ipairs(mTableTools.numKeys(args)) do local item = {} item.content = args[num] item.style = args['item' .. tostring(num) .. '_style'] or args['item_style' .. tostring(num)] item.value = args['item' .. tostring(num) .. '_value'] or args['item_value' .. tostring(num)] table.insert(data.items, item) end return data end function p.renderList(data) -- Renders the list HTML. -- Return the blank string if there are no list items. if type(data.items) ~= 'table' or #data.items < 1 then return '' end -- Render the main div tag. local root = mw.html.create('div') for _, class in ipairs(data.classes or {}) do root:addClass(class) end root:css{['margin-left'] = data.marginLeft} if data.style then root:cssText(data.style) end -- Render the list tag. local list = root:tag(data.listTag or 'ul') list :attr{start = data.start, type = data.type} :css{ ['counter-reset'] = data.counterReset, ['list-style-type'] = data.listStyleType } if data.listStyle then list:cssText(data.listStyle) end -- Render the list items for _, t in ipairs(data.items or {}) do local item = list:tag('li') if data.itemStyle then item:cssText(data.itemStyle) end if t.style then item:cssText(t.style) end item :attr{value = t.value} :wikitext(t.content) end return data.templatestyles .. tostring(root) end function p.renderTrackingCategories(args) local isDeprecated = false -- Tracks deprecated parameters. for k, v in pairs(args) do k = tostring(k) if k:find('^item_style%d+$') or k:find('^item_value%d+$') then isDeprecated = true break end end local ret = '' if isDeprecated then ret = ret .. '[[Category:List templates with deprecated parameters]]' end return ret end function p.makeList(listType, args) if not listType or not listTypes[listType] then error(string.format( "bad argument #1 to 'makeList' ('%s' is not a valid list type)", tostring(listType) ), 2) end checkType('makeList', 2, args, 'table') local data = p.makeListData(listType, args) local list = p.renderList(data) local trackingCategories = p.renderTrackingCategories(args) return list .. trackingCategories end for listType in pairs(listTypes) do p[listType] = function (frame) local mArguments = require('Module:Arguments') local origArgs = mArguments.getArgs(frame, { frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''), valueFunc = function (key, value) if not value or not mw.ustring.find(value, '%S') then return nil end if mw.ustring.find(value, '^%s*[%*#;:]') then return value else return value:match('^%s*(.-)%s*$') end return nil end }) -- Copy all the arguments to a new table, for faster indexing. local args = {} for k, v in pairs(origArgs) do args[k] = v end return p.makeList(listType, args) end end return p 44af96bdee7ebfa2ecf19acd4461d7a35c75856a Template:Navbox/Rings 10 292 1287 1175 2025-08-23T01:44:43Z Sharparam 284703 Add more rings wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Arcane|Arcane]] * [[Ring of Blessed Hand|Blessed Hand]] * [[Ring of Burning Desire|Burning Desire]] * [[Ring of Casting Speed|Casting Speed]] * [[Ring of Colossus|Colossus]] * [[Ring of Command|Command]] * [[Ring of Decay|Decay]] * [[Ring of Degravitas|Degravitas]] * [[Ring of Entropy|Entropy]] * [[Ring of Giant|Giant]] * [[Ring of Gluttony|Gluttony]] * [[Ring of Gravitas|Gravitas]] * [[Ring of Hawk|Hawk]] * [[Ring of Minor Lifesteal|Minor Lifesteal]] * [[Ring of Potential|Potential]] ** [[Ring of Minor Potential|Minor]] * [[Ring of Penetration|Penetration]] * [[Ring of Power|Power]] * [[Ring of Rammstein|Rammstein]] * [[The Scholar's Ring|Scholar]] * [[Ring of Serpent|Serpent]] * [[Ring of Silence|Silence]] * [[Ring of Slumber|Slumber]] * [[Ring of Speed|Speed]] * [[Ring of Stamina|Stamina]] ** [[Ring of Lesser Stamina|Lesser]] * [[Ring of Talent|Talent]] ** [[Ring of Lesser Talent|Lesser]] ** [[Ring of Exceeding Talent|Exceeding]] * [[Ring of Travel|Travel]] * Vitality ** [[Ring of Minor Vitality|Minor]] ** [[Ring of Greater Vitality|Greater]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 2260a141cd1e5e4eeef17c8a4924046ea2dadb61 Template:Navbox/Amulets 10 441 1288 648 2025-08-23T01:47:03Z Sharparam 284703 Add more amulets wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane]] * [[Amulet of Arcane Protection]] * [[Amulet of Divine Might]] * [[Amulet of Evasion]] * [[Amulet of Flux Leech]] * [[Amulet of Recovery]] * [[Amulet of Stability]] * [[Amulet of Vitality]] ** [[Amulet of Minor Vitality|Minor]] * [[Tactician's Amulet]] }}<noinclude>[[Category:Navigation templates]]</noinclude> efc0dd0f4023e758ff3aef9dd09becfd9d54cbcd Template:Navbox/Locations 10 293 1289 383 2025-08-23T01:48:24Z Sharparam 284703 Use proper sublists wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ** [[Monastery#Lower|Lower]] ** [[Monastery#Upper|Upper]] * [[Blok 6147]] * [[Rain District]] ** [[Rain District#Sewers|Sewers]] ** [[Rain District#Center|Center]] * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ** [[Uranopolis#Tower Complex|Tower Complex]] ** [[Uranopolis#Lone Tower|Lone Tower]] * [[Ghost Town]] ** [[Ghost Town#Floor 13|Floor 13]] ** [[Ghost Town#Floor 1|Floor 1]] * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly]] * [[Unknown (location)|Unknown]] * [[Vermillion Fields]] ** [[Vermillion Fields#Plaza|Plaza]] ** [[Vermillion Fields#Temple|Temple]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> 3d0740e2cdedd61bc5d5a8b9e839a3fc4e3c69ee Template:Navbox/Armor 10 439 1290 646 2025-08-23T01:54:03Z Sharparam 284703 Add more helmets wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | group3 = [[Chestguards]] | list3 = * [[Citadel Warrior Chest]] * [[Corrupted Cuirass]] * [[Librarian Overcoat]] * [[Sentinel Chest]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> bcd48e9c7633d725db1a89ef1b7dfb45647860d7 1291 1290 2025-08-23T01:56:48Z Sharparam 284703 Add more pauldrons wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Citadel Warrior Chest]] * [[Corrupted Cuirass]] * [[Librarian Overcoat]] * [[Sentinel Chest]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> c436c20073411ed82436959f407d120e73a84cb6 1292 1291 2025-08-23T02:00:38Z Sharparam 284703 Add more chestguards wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Librarian Trousers]] * [[Sentinel Legguard]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 7a8603530e7b9ce9a79bf61c3ce2fb047c5ee4d4 1293 1292 2025-08-23T02:03:56Z Sharparam 284703 Add more legguards wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Sentinel Gauntlets]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 2b369a603af9b6fb14a83d6348476e1f03f2f0bc 1294 1293 2025-08-23T02:07:51Z Sharparam 284703 Add more gauntlets (Spectre Gauntlets and Ronin Gauntlets are typod in-game as "Spectre Gauntlent" and "Ronin Gauntlent") wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Bone Gloves]] * [[Citadel Defender Gauntlets]] * [[Citadel Warrior Gauntlets]] * [[Contractor Gloves]] * [[Desert Corp Gloves]] * [[Hunter Gloves]] * [[Ranger Gloves]] * [[Reinforced Bone Gauntlets]] * [[Restless Gauntlets]] * [[Ronin Gauntlets]] * [[Sentinel Gauntlets]] * [[Spectre Gauntlets]] * [[Stalker's Gloves]] * [[Technomancer Gloves]] * [[Templar Gloves]] * [[Titan Slayer Gloves]] * [[Utility Uniform Gloves]] * [[Zealot Gloves]] | group6 = [[Armor sets|Sets]] | list6 = * [[Citadel Warrior]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Sentinel]] * [[Techpriest]] * [[Vengeance]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 8f606cebd5eeb2a0564bad423eafcfc863c00d70 1295 1294 2025-08-23T02:11:09Z Sharparam 284703 Add more armor sets wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Bone Gloves]] * [[Citadel Defender Gauntlets]] * [[Citadel Warrior Gauntlets]] * [[Contractor Gloves]] * [[Desert Corp Gloves]] * [[Hunter Gloves]] * [[Ranger Gloves]] * [[Reinforced Bone Gauntlets]] * [[Restless Gauntlets]] * [[Ronin Gauntlets]] * [[Sentinel Gauntlets]] * [[Spectre Gauntlets]] * [[Stalker's Gloves]] * [[Technomancer Gloves]] * [[Templar Gloves]] * [[Titan Slayer Gloves]] * [[Utility Uniform Gloves]] * [[Zealot Gloves]] | group6 = [[Armor sets|Sets]] | list6 = * [[Bone]] * [[Citadel Defender]] * [[Citadel Warrior]] * [[Contractor]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Ranger]] * [[Reinforced Bone]] * [[Restless]] * [[Ronin (armor set)|Ronin]] * [[Sentinel]] * [[Spectre (armor set)|Spectre]] * [[Technomancer (armor set)|Technomancer]] * [[Techpriest]] * [[Templar (armor set)|Templar]] * [[Titan Slayer (armor set)||Titan Slayer]] * [[Utility Uniform]] * [[Vengeance]] * [[Zealot (armor set)|Zealot]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> da89db5cbaeed06ced302a71316862655899bbbb 1296 1295 2025-08-23T02:12:27Z Sharparam 284703 Add more armor sets wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Bone Gloves]] * [[Citadel Defender Gauntlets]] * [[Citadel Warrior Gauntlets]] * [[Contractor Gloves]] * [[Desert Corp Gloves]] * [[Hunter Gloves]] * [[Ranger Gloves]] * [[Reinforced Bone Gauntlets]] * [[Restless Gauntlets]] * [[Ronin Gauntlets]] * [[Sentinel Gauntlets]] * [[Spectre Gauntlets]] * [[Stalker's Gloves]] * [[Technomancer Gloves]] * [[Templar Gloves]] * [[Titan Slayer Gloves]] * [[Utility Uniform Gloves]] * [[Zealot Gloves]] | group6 = [[Armor sets|Sets]] | list6 = * [[Bone]] * [[Citadel Defender]] * [[Citadel Warrior]] * [[Contractor]] * [[Corrupted (armor set)|Corrupted]] * [[Crow]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Ranger]] * [[Reinforced Bone]] * [[Restless]] * [[Ronin (armor set)|Ronin]] * [[Sentinel]] * [[Spectre (armor set)|Spectre]] * [[Stalker]] * [[Technomancer (armor set)|Technomancer]] * [[Techpriest]] * [[Templar (armor set)|Templar]] * [[Titan Slayer (armor set)||Titan Slayer]] * [[Utility Uniform]] * [[Vengeance]] * [[Zealot (armor set)|Zealot]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 90a515a818cacbaa40d4aceba71440c722489d1d 1297 1296 2025-08-23T02:12:44Z Sharparam 284703 Fix extra pipe wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Bone Gloves]] * [[Citadel Defender Gauntlets]] * [[Citadel Warrior Gauntlets]] * [[Contractor Gloves]] * [[Desert Corp Gloves]] * [[Hunter Gloves]] * [[Ranger Gloves]] * [[Reinforced Bone Gauntlets]] * [[Restless Gauntlets]] * [[Ronin Gauntlets]] * [[Sentinel Gauntlets]] * [[Spectre Gauntlets]] * [[Stalker's Gloves]] * [[Technomancer Gloves]] * [[Templar Gloves]] * [[Titan Slayer Gloves]] * [[Utility Uniform Gloves]] * [[Zealot Gloves]] | group6 = [[Armor sets|Sets]] | list6 = * [[Bone]] * [[Citadel Defender]] * [[Citadel Warrior]] * [[Contractor]] * [[Corrupted (armor set)|Corrupted]] * [[Crow]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Ranger]] * [[Reinforced Bone]] * [[Restless]] * [[Ronin (armor set)|Ronin]] * [[Sentinel]] * [[Spectre (armor set)|Spectre]] * [[Stalker]] * [[Technomancer (armor set)|Technomancer]] * [[Techpriest]] * [[Templar (armor set)|Templar]] * [[Titan Slayer (armor set)|Titan Slayer]] * [[Utility Uniform]] * [[Vengeance]] * [[Zealot (armor set)|Zealot]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> a1d9f80f3b1043def39295dc0d2dca65b7f9ed7b Template:Infobox/Armor 10 453 1298 1190 2025-08-23T02:19:06Z Sharparam 284703 Add more armor set special cases wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=armor |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Weight,Set,Passives |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | helm | helmet = [[Helmet]] | pauldron | pauldrons = [[Pauldrons]] | chestguard = [[Chestguard]] | legguard | legguards = [[Legguard]] | gauntlet | gauntlets = [[Gauntlet]] | #default = {{{Type}}} }}}} |Set={{#if:{{{Set|}}}|{{#switch:{{lc:{{{Set}}}}} | corrupted = [[Corrupted (armor set)|Corrupted]] | librarian = [[Librarian (armor set)|Librarian]] | ronin = [[Ronin (armor set)|Ronin]] | spectre = [[Spectre (armor set)|Spectre]] | technomancer = [[Technomancer (armor set)|Technomancer]] | templar = [[Templar (armor set)|Templar]] | titan slayer = [[Titan Slayer (armor set)|Titan Slayer]] | zealot = [[Zealot (armor set)|Zealot]] | #default = [[{{{Set}}}]] }}}} |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \! | token = @@@@ | pattern = [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |tabs= Mk0, Mk1, Mk2, Mk3, Mk4, Mk5 |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | helmet = [[Category:Helmets]] | pauldrons = [[Category:Pauldrons]] | chestguard = [[Category:Chestguards]] | legguard = [[Category:Legguards]] | gauntlet = [[Category:Gauntlets]] | #default = [[Category:Armor]] }}{{Armor/CargoStore |name={{{title|}}} |setname={{{Set|}}} |type={{{Type|}}} |weight={{{Weight|}}} |sharpMk0={{{Mk0_Sharp|}}} |bluntMk0={{{Mk0_Blunt|}}} |technomancyMk0={{{Mk0_Technomancy|}}} |sharpMk1={{{Mk1_Sharp|}}} |bluntMk1={{{Mk1_Blunt|}}} |technomancyMk1={{{Mk1_Technomancy|}}} |sharpMk2={{{Mk2_Sharp|}}} |bluntMk2={{{Mk2_Blunt|}}} |technomancyMk2={{{Mk2_Technomancy|}}} |sharpMk3={{{Mk3_Sharp|}}} |bluntMk3={{{Mk3_Blunt|}}} |technomancyMk3={{{Mk3_Technomancy|}}} |sharpMk4={{{Mk4_Sharp|}}} |bluntMk4={{{Mk4_Blunt|}}} |technomancyMk4={{{Mk4_Technomancy|}}} |sharpMk5={{{Mk5_Sharp|}}} |bluntMk5={{{Mk5_Blunt|}}} |technomancyMk5={{{Mk5_Technomancy|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 4c54a45d5856aaf6e4c9585671b66a336362a99b Ronin Gauntlets 0 829 1299 2025-08-23T02:21:04Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Ronin Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Ronin | Mk4_Sharp = 320 | Mk4_Blunt = 320 | Mk4_Technomancy = 199 }} '''Ronin Gauntlets''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Ronin Gauntlent". {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | image = Ronin Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Ronin | Mk4_Sharp = 320 | Mk4_Blunt = 320 | Mk4_Technomancy = 199 }} '''Ronin Gauntlets''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Ronin Gauntlent". {{Navbox/Armor}} 506b17c7646045e0f174601826e93201781b7489 Ronin Gauntlent 0 830 1300 2025-08-23T02:21:26Z Sharparam 284703 Redirected page to [[Ronin Gauntlets]] wikitext text/x-wiki #REDIRECT [[Ronin Gauntlets]] 5c27736bd21d2b919da298f74934ced3e325c077 Spectre Gauntlets 0 831 1301 2025-08-23T02:23:15Z Sharparam 284703 Created page with "{{Infobox/Armor | image = Spectre Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Spectre | Mk2_Sharp = 166 | Mk2_Blunt = 166 | Mk2_Technomancy = 364 }} '''{{PAGENAME}}''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Spectre Gauntlent". {{Navbox/Armor}}" wikitext text/x-wiki {{Infobox/Armor | image = Spectre Gauntlets.png | Type = Gauntlets | Weight = Light | Set = Spectre | Mk2_Sharp = 166 | Mk2_Blunt = 166 | Mk2_Technomancy = 364 }} '''{{PAGENAME}}''' are [[gauntlets]] [[armor]] found in {{BFF}}. == Bugs == * In-game, the item has a typo and is called "Spectre Gauntlent". {{Navbox/Armor}} cbde60c139aa72b99538a54ff08d455e3e831b93 File:Spectre Gauntlets.png 6 832 1302 2025-08-23T02:24:06Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/icon_spectregauntlet }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/icon_spectregauntlet }} == Licensing == {{License|game}} 809b44d5f3a0d45f28cf1eac39078f6b5851494f File:Ronin Gauntlets.png 6 833 1303 2025-08-23T02:24:46Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/icon_roningauntlet }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armor/icon_roningauntlet }} == Licensing == {{License|game}} 243c54f0195a7379f152837e67f02d3ad8ce6f92 Template:Navbox/Weapons 10 438 1304 1275 2025-08-23T02:28:46Z Sharparam 284703 Add more weapons wikitext text/x-wiki <!-- Weapons must be listed in alphabetical order! --> {{Navbox | {{{1|}}} | template = Navbox/Weapons | title = [[Weapons]] | group1 = [[One-handed weapons|One-handed]] | list1 = * [[Arming Sword]] * [[Industrial Axe]] * [[Industrial Mace]] * [[Iron Pipe]] * [[Longsword]] * [[Machinist's Hammer]] * [[Morning Star]] * [[Paladin Mace]] * [[Ratagan Sabre]] * [[Scimitar]] * [[Soul Breaker]] * [[Tire Iron]] * [[Torch]] * [[Woodchopper]] | group2 = [[Two-handed weapons|Two-handed]] | list2 = * [[Anastasia]] * [[Claymore]] * [[Crescent Axe]] * [[Faussart]] * [[Halberd]] * [[Mechanical Tenderizer]] * [[Nodachi]] * [[Royal Claymore]] * [[Rusty Claymore]] * [[Solaris]] * [[Soul Reaper]] * [[Valtiel]] | group2.1 = [[Dual Wields]] | list2.1 = * [[Blades of Atropos]] * [[Daggers]] * [[Kamas]] * [[Katanas]] * [[Khopeshs]] * [[Lacerators]] | group2.2 = [[Twinblades]] | list2.2 = * [[Marrow]] * [[Twinblade]] | group2.3 = [[Greatweapons]] | list2.3 = * [[Armor Buster]] * [[Divine Greataxe]] * [[Eviscerator]] * [[Greathammer]] * [[Titan Slayer Greatsword]] | group3 = [[Ranged weapons|Ranged]] | list3 = {{Navbox/Ranged weapons|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> be21d6c7ce009c6251403dbd8cd31af5e72ff0b7 Template:Navbox/Consumables 10 286 1305 1256 2025-08-23T02:34:04Z Sharparam 284703 Add more consumables wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Asylum Brew]] * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] * [[Piercing Arrow Pack]] | group2 = [[Fluids]] | list2 = * [[Ionization Fluid]] ** [[Lesser Ionization Fluid|Lesser]] ** [[Greater Ionization Fluid|Greater]] * [[Mystery Concoction]] * [[Regenerative Fluid]] ** [[Greater Regenerative Fluid|Greater]] * [[Restorative Fluid]] ** [[Lesser Restorative Fluid|Lesser]] ** [[Greater Restorative Fluid|Greater]] | group3 = [[Concoctions]] | list3 = * [[Diver's Lungs Concoction]] ** * [[Improved Diver's Lungs Concoction|Improved]] * [[Dreadguard's Concoction]] ** [[Greater Dreadguard's Concoction|Greater]] * [[Experience Concoction]] * [[Fluxshield Concoction]] * [[Forsaken Concoction]] ** [[Greater Forsaken Concoction|Greater]] * [[Indestructible Concoction]] * [[Jaeger's Concoction]] ** [[Greater Jaeger's Concoction|Greater]] * [[Mystery Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Technomancer's Concoction]] ** [[Greater Technomancer's Concoction|Greater]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Agility]] * [[Concoction: All Attributes]] * [[Concoction: Berserker's Tenacity]] * [[Concoction: Constitution]] * [[Concoction: Flux Regen]] * [[Concoction: Health Regen]] * [[Concoction: Intelligence]] * [[Concoction: Mighty Regen]] * [[Concoction: Powerful Immune System]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Zealot's Tears]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 9dade871e30ecba44927d6ec0d33ecebdc66ff4b 1306 1305 2025-08-23T02:34:18Z Sharparam 284703 Fix typo wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Asylum Brew]] * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] * [[Piercing Arrow Pack]] | group2 = [[Fluids]] | list2 = * [[Ionization Fluid]] ** [[Lesser Ionization Fluid|Lesser]] ** [[Greater Ionization Fluid|Greater]] * [[Mystery Concoction]] * [[Regenerative Fluid]] ** [[Greater Regenerative Fluid|Greater]] * [[Restorative Fluid]] ** [[Lesser Restorative Fluid|Lesser]] ** [[Greater Restorative Fluid|Greater]] | group3 = [[Concoctions]] | list3 = * [[Diver's Lungs Concoction]] ** [[Improved Diver's Lungs Concoction|Improved]] * [[Dreadguard's Concoction]] ** [[Greater Dreadguard's Concoction|Greater]] * [[Experience Concoction]] * [[Fluxshield Concoction]] * [[Forsaken Concoction]] ** [[Greater Forsaken Concoction|Greater]] * [[Indestructible Concoction]] * [[Jaeger's Concoction]] ** [[Greater Jaeger's Concoction|Greater]] * [[Mystery Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Technomancer's Concoction]] ** [[Greater Technomancer's Concoction|Greater]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Agility]] * [[Concoction: All Attributes]] * [[Concoction: Berserker's Tenacity]] * [[Concoction: Constitution]] * [[Concoction: Flux Regen]] * [[Concoction: Health Regen]] * [[Concoction: Intelligence]] * [[Concoction: Mighty Regen]] * [[Concoction: Powerful Immune System]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Zealot's Tears]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 6b066a11cab7ab8aef0b4d4e59c636e529dd0b3e Template:Navbox/Amulets 10 441 1307 1288 2025-08-23T02:36:27Z Sharparam 284703 Add more amulets wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane]] * [[Amulet of Arcane Protection]] * [[Amulet of Divine Might]] * [[Amulet of Evasion]] * [[Amulet of Flux Leech]] * [[Amulet of Focus]] * [[Amulet of Recovery]] * [[Amulet of Stability]] * [[Amulet of Vitality]] ** [[Amulet of Minor Vitality|Minor]] * [[Bulwark Amulet]] * [[Nimble Amulet]] * [[Piercing Amulet]] * [[Tactician's Amulet]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 8d160988dbf0290bbb606baaea462fee7463d094 1322 1307 2025-08-23T03:04:44Z Sharparam 284703 Add [[Amulet of Wandering]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Amulets | title = [[Amulets]] | list1 = * [[Amulet of Arcane]] * [[Amulet of Arcane Protection]] * [[Amulet of Divine Might]] * [[Amulet of Evasion]] * [[Amulet of Flux Leech]] * [[Amulet of Focus]] * [[Amulet of Recovery]] * [[Amulet of Stability]] * [[Amulet of Vitality]] ** [[Amulet of Minor Vitality|Minor]] * [[Amulet of Wandering]] * [[Bulwark Amulet]] * [[Nimble Amulet]] * [[Piercing Amulet]] * [[Tactician's Amulet]] }}<noinclude>[[Category:Navigation templates]]</noinclude> ec6c5c481f8f8a31910ca17e40470fc3bd9ed245 File:Tactician's Amulet.png 6 834 1308 2025-08-23T02:38:10Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace32_512 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace32_512 }} == Licensing == {{License|game}} 59bfa39ec0da37d87eccd2eab635b17fa49deabc Tactician's Amulet 0 518 1309 800 2025-08-23T02:43:04Z Sharparam 284703 Add overview wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Tactician's Amulet.png | Effects = Removes invincibility frames | Passives = Vulnerable Dodge }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Overview == In its base form, the amulet simply removes invincibility frames while increasing the distance covered when dashing and dodging. However, at [[The Handler]], it can be used in [[manufacturing]] to craft one of four other amulets: * [[Amulet of Focus]] * [[Bulwark Amulet]] * [[Nimble Amulet]] * [[Piercing Amulet]] Since only one [[Tactician's Amulet]] can be obtained per [[New Game Plus|NG cycle]], it is beneficial to craft one of the above amulets before starting the next cycle, as a new Tactician's Amulet can only be picked up if it's not in the player's inventory already (all of the crafted variants inherit the base effects of this amulet). {{Navbox/Amulets}} dacac9fdf121e0684ede31bfafe489603f22a78c Template:Infobox/Amulet 10 564 1310 883 2025-08-23T02:47:09Z Sharparam 284703 Add sections for effects and passives wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = amulet | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = Basic Info | Basic Info = Effects,Passives | Effects = {{#listmap: | list = {{{Effects|}}} | outsep = \n | token = @@@@ | pattern = * @@@@ | intro = \{\{Plainlist\! | outro = \}\} }} | Passives = {{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} }} {{Main other|[[Category:Amulets]]}}</includeonly> <noinclude>{{Documentation}}</noinclude> bb53ff620ce14ed2d3683541d7ece2871df0da5f Template:Infobox/Passive 10 835 1311 2025-08-23T02:50:53Z Sharparam 284703 Created page with "<includeonly>{{#invoke:Infobox|main | kind = passive | sep = , | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = DescriptionSection | DescriptionSection = Description | DescriptionSection_label = Description | Description_nolabel = yes }}{{Main other|[[Category:Passives]]}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind = passive | sep = , | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = DescriptionSection | DescriptionSection = Description | DescriptionSection_label = Description | Description_nolabel = yes }}{{Main other|[[Category:Passives]]}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude> dfaec1c39c1b442f2ae1c8c6796f881932298cf3 Template:Infobox/Passive/doc 10 836 1312 2025-08-23T02:52:30Z Sharparam 284703 Created page with "== Examples == {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} <syntaxhighlight lang="wikitext"> {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == Examples == {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} <syntaxhighlight lang="wikitext"> {{Infobox/Passive | title = Example Passive | image = Example Passive.png | Description = Increases your stats to ungodly amounts. }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 0d7069df917ddb42da6611a4af4fcda6cd978ea5 Vulnerable Dodge 0 837 1313 2025-08-23T02:54:03Z Sharparam 284703 Created page with "{{Infobox/Passive | image = Vulnerable Dodge.png | Description = Increases the distance of dodges and dashes but removes invulnerability frames. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}" wikitext text/x-wiki {{Infobox/Passive | image = Vulnerable Dodge.png | Description = Increases the distance of dodges and dashes but removes invulnerability frames. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} c774d8e6960f89fc80ac704c449f055d907dbf7f 1317 1313 2025-08-23T02:58:33Z Sharparam 284703 Update image wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Increases the distance of dodges and dashes but removes invulnerability frames. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} 11762e3138684cec8a8616597fb1704d9bdc2b56 Template:Navbox/Passives 10 838 1314 2025-08-23T02:55:02Z Sharparam 284703 Created page with "{{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude> 1d9aa0a9800b46db02fc440036ec626d8caa4ab5 Template:Navbox/Passives/doc 10 839 1315 2025-08-23T02:55:42Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Navigation templates]]}}</includeonly><noinclude>[[Category:Template documentation]]</noinclude> 87827f6829955b934e0e8073491c0fef23954bf8 File:Universal Passive.png 6 840 1316 2025-08-23T02:58:09Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Passive_Universal2 }} This icon is used for several passive abilities in the game. wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Passive_Universal2 }} This icon is used for several passive abilities in the game. == Licensing == {{License|game}} 6bab71931e37905933cfd1119c55b620985cb04a Amulet of Arcane Protection 0 516 1318 796 2025-08-23T03:01:16Z Sharparam 284703 Fix infobox parameters wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Arcane Protection.png | Effects = +1500 [[Technomancy]] armor rating. | Passives = Techno-Defiance }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|4158|-2902|1459}} Found near the top side of a shortcut ladder in [[Uranopolis]]. {{Navbox/Amulets}} af3eb8594ad71b370b85017c7913cee955ba3591 File:Amulet of Arcane Protection.png 6 841 1319 2025-08-23T03:02:25Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace68_512 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace68_512 }} == Licensing == {{License|game}} 4f036d0b23a09dd85f8c3f14dd62335dd75fc5a0 Amulet of Evasion 0 517 1320 798 2025-08-23T03:02:49Z Sharparam 284703 Fix infobox parameters wikitext text/x-wiki {{Infobox/Amulet | title = {{PAGENAME}} | image = Amulet of Evasion.png | Passives = Extended Evasion }} '''{{PAGENAME}}''' is an [[Amulets|amulet]] in {{BFF}}. == Location == {{coords|1251|-8419|551}} Found in [[Ghost Town#Floor 1|Ghost Town (Floor 1)]]. From the [[Homunculus]], go through the doorway and take the left path. When at the outdoors area, take the big stairs up and head immediately right, then to the wall and the item will be in a corner on the right, behind a building. {{Navbox/Amulets}} 4d3fe784a7954d14811807b628f35ce7b9a209b7 File:Amulet of Evasion.png 6 842 1321 2025-08-23T03:03:29Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace30_512 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/BranceletsAndNecklaces/Necklaces_Icons/512/T_Necklace30_512 }} == Licensing == {{License|game}} 0d1e6efa1700da514e282787ea2ace8e7908f4bc Template:Navbox/Rings 10 292 1323 1287 2025-08-23T03:05:49Z Sharparam 284703 Add [[Ring of Lifesteal]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Rings | title = [[Rings]] | list1= * [[Ring of Arcane|Arcane]] * [[Ring of Blessed Hand|Blessed Hand]] * [[Ring of Burning Desire|Burning Desire]] * [[Ring of Casting Speed|Casting Speed]] * [[Ring of Colossus|Colossus]] * [[Ring of Command|Command]] * [[Ring of Decay|Decay]] * [[Ring of Degravitas|Degravitas]] * [[Ring of Entropy|Entropy]] * [[Ring of Giant|Giant]] * [[Ring of Gluttony|Gluttony]] * [[Ring of Gravitas|Gravitas]] * [[Ring of Hawk|Hawk]] * [[Ring of Lifesteal|Lifesteal]] ** [[Ring of Minor Lifesteal|Minor]] * [[Ring of Potential|Potential]] ** [[Ring of Minor Potential|Minor]] * [[Ring of Penetration|Penetration]] * [[Ring of Power|Power]] * [[Ring of Rammstein|Rammstein]] * [[The Scholar's Ring|Scholar]] * [[Ring of Serpent|Serpent]] * [[Ring of Silence|Silence]] * [[Ring of Slumber|Slumber]] * [[Ring of Speed|Speed]] * [[Ring of Stamina|Stamina]] ** [[Ring of Lesser Stamina|Lesser]] * [[Ring of Talent|Talent]] ** [[Ring of Lesser Talent|Lesser]] ** [[Ring of Exceeding Talent|Exceeding]] * [[Ring of Travel|Travel]] * Vitality ** [[Ring of Minor Vitality|Minor]] ** [[Ring of Greater Vitality|Greater]] }}<noinclude>[[Category:Navigation templates]]</noinclude> bdc1ecefbf4e035927c18284c74a4cacd77078b4 Template:Navbox/Armor 10 439 1324 1297 2025-08-23T03:07:35Z Sharparam 284703 Add [[Vengeance]] armor pieces wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Armor | title = [[Armor]] | group1 = [[Helmets]] | list1 = * [[Bone Helmet]] * [[Citadel Defender Helmet]] * [[Citadel Warrior Helmet]] * [[Contractor Helmet]] * [[Crude Helmet]] * [[Desert Corp Helmet]] * [[Deserts Respirator Helmet]] * [[Elipse Helmet]] * [[Eris]] * [[Hunter Mask]] * [[Hunter Prowler Mask]] * [[Hunter Veteran Mask]] * [[Iron Helmet]] * [[Librarian Hood]] * [[Mechacenturion]] * [[Plagued Revenant Helmet]] * [[Ranger Helmet]] * [[Reinforced Bone Helmet]] * [[Restless Helmet]] * [[Ronin Helmet]] * [[Sentinel Helmet]] * [[Skullface Helmet]] * [[Spectre Helmet]] * [[Stalker's Hood]] * [[Technomancer Helmet]] * [[Techpriest Helmet]] * [[Templar Helmet]] * [[Titan Slayer Helmet]] * [[Vengeance Helmet]] * [[Visage Respirator Helmet]] * [[Zealot Helmet]] | group2 = [[Pauldrons]] | list2 = * [[Bone Shoulders]] * [[Citadel Defender Shoulders]] * [[Citadel Warrior Shoulders]] * [[Crow Shoulders]] * [[Desert Corp Shoulders]] * [[Hunter Pauldrons]] * [[Hunter Shoulders]] * [[Ranger Shoulders]] * [[Reinforced Bone Shoulders]] * [[Restless Shoulders]] * [[Ronin Shoulders]] * [[Spectre Shoulders]] * [[Templar Shoulders]] * [[Titan Slayer Shoulders]] * [[Zealot Overcoat]] | group3 = [[Chestguards]] | list3 = * [[Bone Cuirass]] * [[Citadel Defender Chest]] * [[Citadel Warrior Chest]] * [[Contractor Chestpiece]] * [[Corrupted Cuirass]] * [[Crow Cuirass]] * [[Desert Corp Cuirass]] * [[Hunter Coat]] * [[Hunter Garb]] * [[Librarian Overcoat]] * [[Ranger Chestguard]] * [[Reinforced Bone Cuirass]] * [[Restless Cuirass]] * [[Ronin Cuirass]] * [[Sentinel Chest]] * [[Spectre Cuirass]] * [[Stalker's Cuirass]] * [[Technomancer Chestpiece]] * [[Templar Chestpiece]] * [[Titan Slayer Cuirass]] * [[Utility Uniform Jacket]] * [[Vengeance Cuirass]] * [[Zealot Chestpiece]] | group4 = [[Legguards]] | list4 = * [[Bone Legs]] * [[Citadel Defender Legguards]] * [[Citadel Warrior Legguards]] * [[Contractor Legs]] * [[Crow Legguard]] * [[Desert Corp Legs]] * [[Hunter Legguards]] * [[Librarian Trousers]] * [[Ranger Pants]] * [[Reinforced Bone Legguard]] * [[Restless Legguard]] * [[Ronin Pants]] * [[Sentinel Legguard]] * [[Spectre Pants]] * [[Stalker's Pants]] * [[Technomancer Legs]] * [[Templar Legs]] * [[Titan Slayer Legs]] * [[Utility Uniform Pants]] * [[Vengeance Legs]] * [[Zealot Legs]] | group5 = [[Gauntlets]] | list5 = * [[Bone Gloves]] * [[Citadel Defender Gauntlets]] * [[Citadel Warrior Gauntlets]] * [[Contractor Gloves]] * [[Desert Corp Gloves]] * [[Hunter Gloves]] * [[Ranger Gloves]] * [[Reinforced Bone Gauntlets]] * [[Restless Gauntlets]] * [[Ronin Gauntlets]] * [[Sentinel Gauntlets]] * [[Spectre Gauntlets]] * [[Stalker's Gloves]] * [[Technomancer Gloves]] * [[Templar Gloves]] * [[Titan Slayer Gloves]] * [[Utility Uniform Gloves]] * [[Vengeance Gauntlets]] * [[Zealot Gloves]] | group6 = [[Armor sets|Sets]] | list6 = * [[Bone]] * [[Citadel Defender]] * [[Citadel Warrior]] * [[Contractor]] * [[Corrupted (armor set)|Corrupted]] * [[Crow]] * [[Desert Corp]] * [[Librarian (armor set)|Librarian]] * [[Ranger]] * [[Reinforced Bone]] * [[Restless]] * [[Ronin (armor set)|Ronin]] * [[Sentinel]] * [[Spectre (armor set)|Spectre]] * [[Stalker]] * [[Technomancer (armor set)|Technomancer]] * [[Techpriest]] * [[Templar (armor set)|Templar]] * [[Titan Slayer (armor set)|Titan Slayer]] * [[Utility Uniform]] * [[Vengeance]] * [[Zealot (armor set)|Zealot]] | group7 = [[Shields]] | list7 = {{Navbox/Shields|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> daaa58c3a186b831e3a3961cbe57bf86dbe72b04 Intelligence 0 843 1325 2025-08-23T03:19:49Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[flux]] and [[technomancy]] damage. == Overview == Maximum flux increases by 5 between levels 6 and 100, then drops to 2 until level 200. After level 200, maximum flux will increase by 1 for each level. The damage increase varies as the attribute is increased, see the table for details. After intelligence reaches level 200, damage will no longer increase, making the hardcap for bonus damag..." wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[flux]] and [[technomancy]] damage. == Overview == Maximum flux increases by 5 between levels 6 and 100, then drops to 2 until level 200. After level 200, maximum flux will increase by 1 for each level. The damage increase varies as the attribute is increased, see the table for details. After intelligence reaches level 200, damage will no longer increase, making the hardcap for bonus damage 830%. {| class="wikitable sortable sticky-header-multi hover-highlight mw-collapsible mw-collapsed" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Intelligence ! class="unsortable" scope="col" rowspan="2" | Max flux ! class="unsortable" scope="col" rowspan="2" | +Tech dmg ! class="unsortable" scope="col" colspan="2" | Increments |- ! class="unsortable" scope="col" | Max flux ! class="unsortable" scope="col" | +Tech dmg |- | 0 || 90 || 80% || 0 || 0% |- | 1 || 90 || 80% || 0 || 0% |- | 2 || 90 || 80% || 0 || 0% |- | 3 || 90 || 80% || 0 || 0% |- | 4 || 90 || 80% || 0 || 0% |- | 5 || 90 || 80% || 0 || 0% |- | 6 || 95 || 83% || 5 || 3% |- | 7 || 100 || 86% || 5 || 3% |- | 8 || 105 || 89% || 5 || 3% |- | 9 || 110 || 92% || 5 || 3% |- | 10 || 115 || 95% || 5 || 3% |- | 11 || 120 || 99% || 5 || 4% |- | 12 || 125 || 103% || 5 || 4% |- | 13 || 130 || 107% || 5 || 4% |- | 14 || 135 || 111% || 5 || 4% |- | 15 || 140 || 115% || 5 || 4% |- | 16 || 145 || 120% || 5 || 5% |- | 17 || 150 || 125% || 5 || 5% |- | 18 || 155 || 130% || 5 || 5% |- | 19 || 160 || 135% || 5 || 5% |- | 20 || 165 || 140% || 5 || 5% |- | 21 || 170 || 150% || 5 || 10% |- | 22 || 175 || 160% || 5 || 10% |- | 23 || 180 || 170% || 5 || 10% |- | 24 || 185 || 180% || 5 || 10% |- | 25 || 190 || 190% || 5 || 10% |- | 26 || 195 || 200% || 5 || 10% |- | 27 || 200 || 210% || 5 || 10% |- | 28 || 205 || 220% || 5 || 10% |- | 29 || 210 || 230% || 5 || 10% |- | 30 || 215 || 240% || 5 || 10% |- | 31 || 220 || 252% || 5 || 12% |- | 32 || 225 || 264% || 5 || 12% |- | 33 || 230 || 276% || 5 || 12% |- | 34 || 235 || 288% || 5 || 12% |- | 35 || 240 || 300% || 5 || 12% |- | 36 || 245 || 312% || 5 || 12% |- | 37 || 250 || 324% || 5 || 12% |- | 38 || 255 || 336% || 5 || 12% |- | 39 || 260 || 348% || 5 || 12% |- | 40 || 265 || 360% || 5 || 12% |- | 41 || 270 || 372% || 5 || 12% |- | 42 || 275 || 384% || 5 || 12% |- | 43 || 280 || 396% || 5 || 12% |- | 44 || 285 || 408% || 5 || 12% |- | 45 || 290 || 420% || 5 || 12% |- | 46 || 295 || 432% || 5 || 12% |- | 47 || 300 || 444% || 5 || 12% |- | 48 || 305 || 456% || 5 || 12% |- | 49 || 310 || 468% || 5 || 12% |- | 50 || 315 || 480% || 5 || 12% |- | 51 || 320 || 483% || 5 || 3% |- | 52 || 325 || 486% || 5 || 3% |- | 53 || 330 || 489% || 5 || 3% |- | 54 || 335 || 492% || 5 || 3% |- | 55 || 340 || 495% || 5 || 3% |- | 56 || 345 || 498% || 5 || 3% |- | 57 || 350 || 501% || 5 || 3% |- | 58 || 355 || 504% || 5 || 3% |- | 59 || 360 || 507% || 5 || 3% |- | 60 || 365 || 510% || 5 || 3% |- | 61 || 370 || 513% || 5 || 3% |- | 62 || 375 || 516% || 5 || 3% |- | 63 || 380 || 519% || 5 || 3% |- | 64 || 385 || 522% || 5 || 3% |- | 65 || 390 || 525% || 5 || 3% |- | 66 || 395 || 528% || 5 || 3% |- | 67 || 400 || 531% || 5 || 3% |- | 68 || 405 || 534% || 5 || 3% |- | 69 || 410 || 537% || 5 || 3% |- | 70 || 415 || 540% || 5 || 3% |- | 71 || 420 || 543% || 5 || 3% |- | 72 || 425 || 546% || 5 || 3% |- | 73 || 430 || 549% || 5 || 3% |- | 74 || 435 || 552% || 5 || 3% |- | 75 || 440 || 555% || 5 || 3% |- | 76 || 445 || 558% || 5 || 3% |- | 77 || 450 || 561% || 5 || 3% |- | 78 || 455 || 564% || 5 || 3% |- | 79 || 460 || 567% || 5 || 3% |- | 80 || 465 || 570% || 5 || 3% |- | 81 || 470 || 573% || 5 || 3% |- | 82 || 475 || 576% || 5 || 3% |- | 83 || 480 || 579% || 5 || 3% |- | 84 || 485 || 582% || 5 || 3% |- | 85 || 490 || 585% || 5 || 3% |- | 86 || 495 || 588% || 5 || 3% |- | 87 || 500 || 591% || 5 || 3% |- | 88 || 505 || 594% || 5 || 3% |- | 89 || 510 || 597% || 5 || 3% |- | 90 || 515 || 600% || 5 || 3% |- | 91 || 520 || 603% || 5 || 3% |- | 92 || 525 || 606% || 5 || 3% |- | 93 || 530 || 609% || 5 || 3% |- | 94 || 535 || 612% || 5 || 3% |- | 95 || 540 || 615% || 5 || 3% |- | 96 || 545 || 618% || 5 || 3% |- | 97 || 550 || 621% || 5 || 3% |- | 98 || 555 || 624% || 5 || 3% |- | 99 || 560 || 627% || 5 || 3% |- | 100 || 565 || 630% || 5 || 3% |- | 101 || 567 || 632% || 2 || 2% |- | 102 || 569 || 634% || 2 || 2% |- | 103 || 571 || 636% || 2 || 2% |- | 104 || 573 || 638% || 2 || 2% |- | 105 || 575 || 640% || 2 || 2% |- | 106 || 577 || 642% || 2 || 2% |- | 107 || 579 || 644% || 2 || 2% |- | 108 || 581 || 646% || 2 || 2% |- | 109 || 583 || 648% || 2 || 2% |- | 110 || 585 || 650% || 2 || 2% |- | 111 || 587 || 652% || 2 || 2% |- | 112 || 589 || 654% || 2 || 2% |- | 113 || 591 || 656% || 2 || 2% |- | 114 || 593 || 658% || 2 || 2% |- | 115 || 595 || 660% || 2 || 2% |- | 116 || 597 || 662% || 2 || 2% |- | 117 || 599 || 664% || 2 || 2% |- | 118 || 601 || 666% || 2 || 2% |- | 119 || 603 || 668% || 2 || 2% |- | 120 || 605 || 670% || 2 || 2% |- | 121 || 607 || 672% || 2 || 2% |- | 122 || 609 || 674% || 2 || 2% |- | 123 || 611 || 676% || 2 || 2% |- | 124 || 613 || 678% || 2 || 2% |- | 125 || 615 || 680% || 2 || 2% |- | 126 || 617 || 682% || 2 || 2% |- | 127 || 619 || 684% || 2 || 2% |- | 128 || 621 || 686% || 2 || 2% |- | 129 || 623 || 688% || 2 || 2% |- | 130 || 625 || 690% || 2 || 2% |- | 131 || 627 || 692% || 2 || 2% |- | 132 || 629 || 694% || 2 || 2% |- | 133 || 631 || 696% || 2 || 2% |- | 134 || 633 || 698% || 2 || 2% |- | 135 || 635 || 700% || 2 || 2% |- | 136 || 637 || 702% || 2 || 2% |- | 137 || 639 || 704% || 2 || 2% |- | 138 || 641 || 706% || 2 || 2% |- | 139 || 643 || 708% || 2 || 2% |- | 140 || 645 || 710% || 2 || 2% |- | 141 || 647 || 712% || 2 || 2% |- | 142 || 649 || 714% || 2 || 2% |- | 143 || 651 || 716% || 2 || 2% |- | 144 || 653 || 718% || 2 || 2% |- | 145 || 655 || 720% || 2 || 2% |- | 146 || 657 || 722% || 2 || 2% |- | 147 || 659 || 724% || 2 || 2% |- | 148 || 661 || 726% || 2 || 2% |- | 149 || 663 || 728% || 2 || 2% |- | 150 || 665 || 730% || 2 || 2% |- | 151 || 667 || 732% || 2 || 2% |- | 152 || 669 || 734% || 2 || 2% |- | 153 || 671 || 736% || 2 || 2% |- | 154 || 673 || 738% || 2 || 2% |- | 155 || 675 || 740% || 2 || 2% |- | 156 || 677 || 742% || 2 || 2% |- | 157 || 679 || 744% || 2 || 2% |- | 158 || 681 || 746% || 2 || 2% |- | 159 || 683 || 748% || 2 || 2% |- | 160 || 685 || 750% || 2 || 2% |- | 161 || 687 || 752% || 2 || 2% |- | 162 || 689 || 754% || 2 || 2% |- | 163 || 691 || 756% || 2 || 2% |- | 164 || 693 || 758% || 2 || 2% |- | 165 || 695 || 760% || 2 || 2% |- | 166 || 697 || 762% || 2 || 2% |- | 167 || 699 || 764% || 2 || 2% |- | 168 || 701 || 766% || 2 || 2% |- | 169 || 703 || 768% || 2 || 2% |- | 170 || 705 || 770% || 2 || 2% |- | 171 || 707 || 772% || 2 || 2% |- | 172 || 709 || 774% || 2 || 2% |- | 173 || 711 || 776% || 2 || 2% |- | 174 || 713 || 778% || 2 || 2% |- | 175 || 715 || 780% || 2 || 2% |- | 176 || 717 || 782% || 2 || 2% |- | 177 || 719 || 784% || 2 || 2% |- | 178 || 721 || 786% || 2 || 2% |- | 179 || 723 || 788% || 2 || 2% |- | 180 || 725 || 790% || 2 || 2% |- | 181 || 727 || 792% || 2 || 2% |- | 182 || 729 || 794% || 2 || 2% |- | 183 || 731 || 796% || 2 || 2% |- | 184 || 733 || 798% || 2 || 2% |- | 185 || 735 || 800% || 2 || 2% |- | 186 || 737 || 802% || 2 || 2% |- | 187 || 739 || 804% || 2 || 2% |- | 188 || 741 || 806% || 2 || 2% |- | 189 || 743 || 808% || 2 || 2% |- | 190 || 745 || 810% || 2 || 2% |- | 191 || 747 || 812% || 2 || 2% |- | 192 || 749 || 814% || 2 || 2% |- | 193 || 751 || 816% || 2 || 2% |- | 194 || 753 || 818% || 2 || 2% |- | 195 || 755 || 820% || 2 || 2% |- | 196 || 757 || 822% || 2 || 2% |- | 197 || 759 || 824% || 2 || 2% |- | 198 || 761 || 826% || 2 || 2% |- | 199 || 763 || 828% || 2 || 2% |- | 200 || 765 || 830% || 2 || 2% |} [[Category:Attributes]] 904a952540b7b412f5d5b7f4b0504f5a22f5ddda Constitution 0 844 1326 2025-08-23T03:26:18Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[health]] and stagger resistance. == Overview == Maximum health starts at 200, with each additional level increasing it by 0, 25, or 50 (see the table for details). After level 65, maximum health increases by 25 for each level. Stagger resistance starts at 5%. Level 6 gives the first increase to stagger resistance by 0.5%, which continues until 45, after which it drops to 0, making the har..." wikitext text/x-wiki '''{{PAGENAME}}''' is one of the [[attributes]] in {{BFF}}. It affects maximum [[health]] and stagger resistance. == Overview == Maximum health starts at 200, with each additional level increasing it by 0, 25, or 50 (see the table for details). After level 65, maximum health increases by 25 for each level. Stagger resistance starts at 5%. Level 6 gives the first increase to stagger resistance by 0.5%, which continues until 45, after which it drops to 0, making the hardcap for bonus stagger resist 25%. {| class="wikitable sortable sticky-header-multi hover-highlight mw-collapsible mw-collapsed" style="text-align: right;" |- ! class="unsortable" scope="col" rowspan="2" | Constitution ! class="unsortable" scope="col" rowspan="2" | Max HP ! class="unsortable" scope="col" rowspan="2" | +Stagger res ! class="unsortable" scope="col" colspan="2" | Increments |- ! class="unsortable" scope="col" | Max HP ! class="unsortable" scope="col" | +Stagger res |- | 0 || {{fnum|200}} || 5.0% || 50 || 5.0% |- | 1 || {{fnum|200}} || 5.0% || 0 || 0.0% |- | 2 || {{fnum|225}} || 5.0% || 25 || 0.0% |- | 3 || {{fnum|250}} || 5.0% || 25 || 0.0% |- | 4 || {{fnum|275}} || 5.0% || 25 || 0.0% |- | 5 || {{fnum|300}} || 5.0% || 25 || 0.0% |- | 6 || {{fnum|325}} || 5.5% || 25 || 0.5% |- | 7 || {{fnum|350}} || 6.0% || 25 || 0.5% |- | 8 || {{fnum|400}} || 6.5% || 50 || 0.5% |- | 9 || {{fnum|425}} || 7.0% || 25 || 0.5% |- | 10 || {{fnum|475}} || 7.5% || 50 || 0.5% |- | 11 || {{fnum|500}} || 8.0% || 25 || 0.5% |- | 12 || {{fnum|525}} || 8.5% || 25 || 0.5% |- | 13 || {{fnum|575}} || 9.0% || 50 || 0.5% |- | 14 || {{fnum|600}} || 9.5% || 25 || 0.5% |- | 15 || {{fnum|650}} || 10.0% || 50 || 0.5% |- | 16 || {{fnum|700}} || 10.5% || 50 || 0.5% |- | 17 || {{fnum|750}} || 11.0% || 50 || 0.5% |- | 18 || {{fnum|800}} || 11.5% || 50 || 0.5% |- | 19 || {{fnum|850}} || 12.0% || 50 || 0.5% |- | 20 || {{fnum|900}} || 12.5% || 50 || 0.5% |- | 21 || {{fnum|925}} || 13.0% || 25 || 0.5% |- | 22 || {{fnum|950}} || 13.5% || 25 || 0.5% |- | 23 || {{fnum|975}} || 14.0% || 25 || 0.5% |- | 24 || {{fnum|1000}} || 14.5% || 25 || 0.5% |- | 25 || {{fnum|1050}} || 15.0% || 50 || 0.5% |- | 26 || {{fnum|1075}} || 15.5% || 25 || 0.5% |- | 27 || {{fnum|1100}} || 16.0% || 25 || 0.5% |- | 28 || {{fnum|1125}} || 16.5% || 25 || 0.5% |- | 29 || {{fnum|1150}} || 17.0% || 25 || 0.5% |- | 30 || {{fnum|1200}} || 17.5% || 50 || 0.5% |- | 31 || {{fnum|1225}} || 18.0% || 25 || 0.5% |- | 32 || {{fnum|1250}} || 18.5% || 25 || 0.5% |- | 33 || {{fnum|1275}} || 19.0% || 25 || 0.5% |- | 34 || {{fnum|1300}} || 19.5% || 25 || 0.5% |- | 35 || {{fnum|1325}} || 20.0% || 25 || 0.5% |- | 36 || {{fnum|1350}} || 20.5% || 25 || 0.5% |- | 37 || {{fnum|1375}} || 21.0% || 25 || 0.5% |- | 38 || {{fnum|1400}} || 21.5% || 25 || 0.5% |- | 39 || {{fnum|1425}} || 22.0% || 25 || 0.5% |- | 40 || {{fnum|1475}} || 22.5% || 50 || 0.5% |- | 41 || {{fnum|1500}} || 23.0% || 25 || 0.5% |- | 42 || {{fnum|1525}} || 23.5% || 25 || 0.5% |- | 43 || {{fnum|1550}} || 24.0% || 25 || 0.5% |- | 44 || {{fnum|1575}} || 24.5% || 25 || 0.5% |- | 45 || {{fnum|1600}} || 25.0% || 25 || 0.5% |- | 46 || {{fnum|1600}} || 25.0% || 0 || 0.0% |- | 47 || {{fnum|1625}} || 25.0% || 25 || 0.0% |- | 48 || {{fnum|1650}} || 25.0% || 25 || 0.0% |- | 49 || {{fnum|1650}} || 25.0% || 0 || 0.0% |- | 50 || {{fnum|1675}} || 25.0% || 25 || 0.0% |- | 51 || {{fnum|1700}} || 25.0% || 25 || 0.0% |- | 52 || {{fnum|1700}} || 25.0% || 0 || 0.0% |- | 53 || {{fnum|1700}} || 25.0% || 0 || 0.0% |- | 54 || {{fnum|1700}} || 25.0% || 0 || 0.0% |- | 55 || {{fnum|1725}} || 25.0% || 25 || 0.0% |- | 56 || {{fnum|1725}} || 25.0% || 0 || 0.0% |- | 57 || {{fnum|1725}} || 25.0% || 0 || 0.0% |- | 58 || {{fnum|1725}} || 25.0% || 0 || 0.0% |- | 59 || {{fnum|1750}} || 25.0% || 25 || 0.0% |- | 60 || {{fnum|1750}} || 25.0% || 0 || 0.0% |- | 61 || {{fnum|1750}} || 25.0% || 0 || 0.0% |- | 62 || {{fnum|1750}} || 25.0% || 0 || 0.0% |- | 63 || {{fnum|1750}} || 25.0% || 0 || 0.0% |- | 64 || {{fnum|1750}} || 25.0% || 0 || 0.0% |- | 65 || {{fnum|1775}} || 25.0% || 25 || 0.0% |} [[Category:Attributes]] c3723f75964d29317b224f3d07316e154a7e63a1 Level 0 707 1327 1096 2025-08-23T03:32:35Z Sharparam 284703 Add some data for level 30 wikitext text/x-wiki {{stub}} '''{{PAGENAME}}''' is a measure of a player's experience. == Overview == The level increases by gaining experience points through exploration, defeating [[enemies]], and picking up or interacting with [[items]] or [[lore]] objects. The amount of experience points required to reach further levels will regularly increase, although not with every level. Every level up also grants two attribute points that can be used to increase player [[attributes]]. When reaching level 25 you get 6 points instead of 2. The max level is 25, with each [[NG+]] iteration increasing the cap by 5, to a maximum of 40 in [[NG+|NG+3]]. {| class="wikitable sticky-header hover-highlight" style="text-align: right;" |- ! scope="col" | Level ! scope="col" | EXP to next ! scope="col" | Cost increase ! scope="col" | Total EXP ! scope="col" | Attribute points ! scope="col" | Total attr points |- | 0 || {{fnum|480}} || {{fnum|480}} || {{fnum|0}} || 0 || 0 |- | 1 || {{fnum|1220}} || {{fnum|740}} || {{fnum|480}} || 2 || 2 |- | 2 || {{fnum|2250}} || {{fnum|1030}} || {{fnum|1700}} || 2 || 4 |- | 3 || {{fnum|13500}} || {{fnum|11250}} || {{fnum|3950}} || 2 || 6 |- | 4 || {{fnum|13500}} || {{fnum|0}} || {{fnum|17450}} || 2 || 8 |- | 5 || {{fnum|15000}} || {{fnum|1500}} || {{fnum|30950}} || 4 || 12 |- | 6 || {{fnum|15000}} || {{fnum|0}} || {{fnum|45950}} || 2 || 14 |- | 7 || {{fnum|15000}} || {{fnum|0}} || {{fnum|60950}} || 2 || 16 |- | 8 || {{fnum|15000}} || {{fnum|0}} || {{fnum|75950}} || 2 || 18 |- | 9 || {{fnum|15000}} || {{fnum|0}} || {{fnum|90950}} || 2 || 20 |- | 10 || {{fnum|18500}} || {{fnum|3500}} || {{fnum|105950}} || 4 || 24 |- | 11 || {{fnum|18500}} || {{fnum|0}} || {{fnum|124450}} || 2 || 26 |- | 12 || {{fnum|18500}} || {{fnum|0}} || {{fnum|142950}} || 2 || 28 |- | 13 || {{fnum|18500}} || {{fnum|0}} || {{fnum|161450}} || 2 || 30 |- | 14 || {{fnum|18500}} || {{fnum|0}} || {{fnum|179950}} || 2 || 32 |- | 15 || {{fnum|21500}} || {{fnum|3000}} || {{fnum|198450}} || 4 || 36 |- | 16 || {{fnum|21500}} || {{fnum|0}} || {{fnum|219950}} || 2 || 38 |- | 17 || {{fnum|21500}} || {{fnum|0}} || {{fnum|241450}} || 2 || 40 |- | 18 || {{fnum|21500}} || {{fnum|0}} || {{fnum|262950}} || 2 || 42 |- | 19 || {{fnum|21500}} || {{fnum|0}} || {{fnum|284450}} || 2 || 44 |- | 20 || {{fnum|25000}} || {{fnum|3500}} || {{fnum|305950}} || 4 || 48 |- | 21 || {{fnum|25000}} || {{fnum|0}} || {{fnum|330950}} || 2 || 50 |- | 22 || {{fnum|25000}} || {{fnum|0}} || {{fnum|355950}} || 2 || 52 |- | 23 || {{fnum|25000}} || {{fnum|0}} || {{fnum|380950}} || 2 || 54 |- | 24 || {{fnum|25000}} || {{fnum|0}} || {{fnum|405950}} || 2 || 56 |- | 25 || {{fnum|103420}} || {{fnum|78420}} || {{fnum|430950}} || 6 || 62 |- | 26 || {{fnum|103430}} || {{fnum|10}} || {{fnum|534370}} || 3 || 65 |- | 27 || {{fnum|103430}} || {{fnum|0}} || {{fnum|637800}} || 3 || 68 |- | 28 || {{fnum|103430}} || {{fnum|0}} || {{fnum|741230}} || 3 || 71 |- | 29 || {{fnum|103430}} || {{fnum|0}} || {{fnum|844660}} || 3 || 74 |- | 30 || ??? || ??? || {{fnum|948090}} || 6 || 80 |} [[Category:Game mechanics]] f6cf6898dcaffb864de12f0ab74a8307f0f83552 Asylum 0 357 1328 477 2025-08-23T04:09:39Z Sharparam 284703 Add NPC section wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} == NPCs == * [[Inquisitor Commander Alexius]] {{Navbox/Locations}} [[Category:Locations]] f3f760da6e54723bfa17a9677d0604c115bc10b4 1329 1328 2025-08-23T04:10:21Z Sharparam 284703 Add area boss wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} == NPCs == * [[Inquisitor Commander Alexius]] == Bosses == * [[Plagued Nemesis]] {{Navbox/Locations}} [[Category:Locations]] 579690e518d2f45738b4a9969fa23aba0a82777f MediaWiki:Common.css 8 235 1330 259 2025-08-23T16:43:34Z Sharparam 284703 Configure accent and content border color for dark theme css text/css /* CSS placed here will be applied to all skins */ /****************************************************************************************** ********************************* Start user-edit variables ******************************* ******************************************************************************************/ /***************************************** ****** START BASIC DESIGN VARIABLES ****** ----------------------------------------*/ :root { --wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif; --wiki-sidebar-heading-font-family: sans-serif; --wiki-content-border-radius: 0px; --wiki-sidebar-border-radius: 0px; } /*---------------------------------------- ******* END BASIC DESIGN VARIABLES ******* *****************************************/ /***************************************** ****** START BASIC COLOR VARIABLES ******* ----------------------------------------*/ :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-content-background-color: #ffffff; --wiki-content-background-opacity: 100%; --wiki-content-border-color: #a7d7f9; --wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ LIGHT VIEW ] */ --wiki-accent-color: #3366cc; --wiki-accent-label-color: #ffffff; --wiki-accent-link-color: #D5FB51; --wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* end light styles */ /* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=dark, */ /* individual themes are prefixed with .theme- instead */ .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); --wiki-content-background-color: #202020; --wiki-content-background-opacity: 90%; /* DEFAULT: --wiki-content-border-color: #991A51; */ --wiki-content-border-color: hsl(0deg 0% 60%); --wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ DARK VIEW ] */ /* DEFAULT: --wiki-accent-color: #ff4d9d; */ --wiki-accent-color: hsl(0deg 0% 75%); --wiki-accent-label-color: #000; --wiki-accent-link-color: #1e1e43; --wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* End dark styles */ /*---------------------------------------- ******* END BASIC COLOR VARIABLES ******** *****************************************/ /***************************************** **** START ADVANCED COLOR VARIABLES ****** ----------------------------------------*/ :root, .view-light { /******************* * Maybe edit these * [ LIGHT VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #111111; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #ba0000; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ LIGHT VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ LIGHT VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #bf0017; --wiki-warning-color: #b05f30; --wiki-success-color: #0c742f; /**/ /*********************************** * Likely do not need to edit these * [ LIGHT VIEW ] ************************************/ --wiki-body-dynamic-color: #000000; --wiki-body-dynamic-color--inverted: #ffffff; --wiki-body-dynamic-color--secondary: #333333; --wiki-body-dynamic-color--secondary--inverted: #cccccc; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #ffffff; --wiki-content-dynamic-color: #000000; --wiki-content-dynamic-color--inverted: #ffffff; --wiki-content-dynamic-color--secondary: #333333; --wiki-content-dynamic-color--secondary--inverted: #cccccc; /* [ LIGHT VIEW ] */ --wiki-alert-label-color: #ffffff; --wiki-warning-label-color: #ffffff; --wiki-success-label-color: #ffffff; --wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */ /**/ } .view-dark { /******************* * Maybe edit these * [ DARK VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #ededed; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #FC5B4F; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ DARK VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ DARK VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #ff576a; --wiki-warning-color: #cf721c; --wiki-success-color: #13aa45; /**/ /*********************************** * Likely do not need to edit these * [ DARK VIEW ] ************************************/ --wiki-body-dynamic-color: #ffffff; --wiki-body-dynamic-color--inverted: #000000; --wiki-body-dynamic-color--secondary: #cccccc; --wiki-body-dynamic-color--secondary--inverted: #333333; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #000; --wiki-content-dynamic-color: #ffffff; --wiki-content-dynamic-color--inverted: #000000; --wiki-content-dynamic-color--secondary: #cccccc; --wiki-content-dynamic-color--secondary--inverted: #333333; /* [ DARK VIEW ] */ --wiki-alert-label-color: #000000; --wiki-warning-label-color: #000000; --wiki-success-label-color: #000000; --wiki-icon-general-filter: invert(100%); } /*---------------------------------------- ***** END ADVANCED COLOR VARIABLES ******* *****************************************/ /***************************************** **** START ADVANCED DESIGN VARIABLES ***** ----------------------------------------*/ :root { /*********************** start logo position ----------------------*/ --wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */ --wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */ --wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */ --wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */ --wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */ /*----------------------- end logo position ***********************/ --wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */ --wiki-body-font-family: sans-serif; --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */ /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-width: 1px; --wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */ --wiki-sidebar-portal-spacing: 0px; --wiki-sidebar-border-width: var(--wiki-content-border-width); --wiki-navigation-border-radius: 0px; /* border radius of tabs */ /******************* * Maybe edit these * [ DESIGN ] ********************/ --wiki-logo-filter: none; /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-top-radius: var(--wiki-content-border-radius); --wiki-content-border-style: solid; --wiki-content-border-image: none; --wiki-content-backdrop-filter: none; --wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */ --wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */ --wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-line-height: 1.125; --wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-margin: 0.5em; --wiki-sidebar-list-item-padding: 0.25em 0.25rem; --wiki-sidebar-list-padding: 0.25rem; --wiki-sidebar-list-item-background--hover: none; /* background of hover item */ --wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */ --wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */ --wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-box-background-color: var(--wiki-content-background-color); --wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content)); --wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ --wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ /* nav tabs style. The vector gradient is default. * If you want to customize the style of tabs, it's easier to start with the following settings: * --wiki-navigation-background-image: none; * --wiki-navigation-selected-background-image: none; * --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px ); * --wiki-navigation-selected-border-bottom-background: none; * --wiki-navigation-tab-spacing: 0.25em; * --wiki-navigation-tab-padding-top: 0.5em; * --wiki-navigation-tab-padding-bottom: 0.5em; */ --wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */ --wiki-navigation-tab-padding-top: 1.25em; --wiki-navigation-tab-padding-x: 0.75em; --wiki-navigation-tab-padding-bottom: 4px; --wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */ --wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */ --wiki-navigation-border-image: none; --wiki-navigation-selected-border-image: var(--wiki-navigation-border-image); --wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%); --wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x; --wiki-navigation-background-position: left bottom, right bottom, left bottom; --wiki-navigation-background-size: 1px 100%, 1px 100%, 100%; --wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%); --wiki-navigation-selected-background-repeat: no-repeat, no-repeat; --wiki-navigation-selected-background-position: left bottom, right bottom; --wiki-navigation-selected-background-size: 1px 100%, 1px 100%; --wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px); /* affects the dropdown menu under More */ --wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color); --wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color); --wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */ --wiki-navigation-dropdown-border-width: 1px; --wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius); --wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */ --wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */ --wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */ --wiki-navigation-dropdown-border-image: none; --wiki-navigation-dropdown-backdrop-filter: none; --wiki-navigation-dropdown-box-shadow: none; /* box shadow */ /* styles of the footer */ --wiki-spacing-before-footer: 0px; --wiki-footer-border-image: none; /* padding on body element */ --wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */ --wiki-left-spacing: 0.5em; --wiki-right-spacing: 1em; --wiki-bottom-spacing: 2em; /* end design variables */ } /*---------------------------------------- ***** END ADVANCED DESIGN VARIABLES ****** *****************************************/ /******************************* **** START SHARED VARIABLES **** **** tl;dr: don't edit this **** ********************************/ /* These variables are rarely touched, usually inherit other variables, and are shared on all themes. In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision, understand what you are doing, and *know* that what you are trying to do is not accomplished by changing another variable in the above sections. Since these are by default shared across all themes, if you support multiple themes you'll probably want to separate the variables you want to modify here into .view-x blocks like above. If you don't understand what that means or how to do that then you probably shouldn't be modifying this section. */ :root { --wiki-content-border-bottom-width: var(--wiki-content-border-width); --wiki-content-border-bottom-style: var(--wiki-content-border-style); --wiki-content-border-bottom-color: var(--wiki-content-border-color); --wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%); --wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color)); --wiki-content-text-color--hover: var(--wiki-content-text-color); /* heading */ --wiki-content-heading-border-bottom-width: 1px; --wiki-content-heading-border-style: solid; --wiki-content-heading-font-weight: normal; --wiki-content-heading-font-style: normal; --wiki-content-heading-text-transform: none; --wiki-content-heading-line-height: normal; --wiki-content-heading-text-shadow: none; /* first heading (h1) */ --wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width); --wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); --wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight); --wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style); --wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform); --wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-firstheading-color: var(--wiki-content-heading-color); --wiki-content-firstheading-text-shadow: none; /* sub-heading (h3, h4, h5, h6) */ --wiki-content-subheading-border-bottom-width: 0px; --wiki-content-subheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-subheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-subheading-font-family: var(--wiki-body-font-family); --wiki-content-subheading-font-weight: bold; --wiki-content-subheading-font-style: normal; --wiki-content-subheading-text-transform: none; --wiki-content-subheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-subheading-color: var(--wiki-content-heading-color); --wiki-content-subheading-text-shadow: none; /* heading size */ --wiki-content-firstheading-font-size: 1.8em; --wiki-content-heading-h2-font-size: 1.5em; --wiki-content-heading-h3-font-size: 1.2em; --wiki-content-heading-h4-font-size: 114%; --wiki-content-heading-h5-font-size: 108%; --wiki-content-heading-h6-font-size: 100%; --wiki-content-toc-background: var(--wiki-content-background-color--secondary); --wiki-content-toc-border-width: 1px; --wiki-content-toc-border-style: solid; --wiki-content-toc-border-color: var(--wiki-content-border-color); --wiki-content-toc-border-radius: 0px; --wiki-content-toc-border-image: none; --wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000; --wiki-content-catlinks-background: var(--wiki-content-background-color--secondary); --wiki-content-catlinks-border-width: 1px; --wiki-content-catlinks-border-style: solid; --wiki-content-catlinks-border-color: var(--wiki-content-border-color); --wiki-content-catlinks-border-radius: 0px; --wiki-content-catlinks-border-image: none; --wiki-content-catlinks-box-shadow: none; --wiki-content-filetoc-background: var(--wiki-content-background-color--secondary); --wiki-content-filetoc-border-width: 1px; --wiki-content-filetoc-border-style: solid; --wiki-content-filetoc-border-color: var(--wiki-content-border-color); --wiki-content-filetoc-border-radius: 0px; --wiki-content-filetoc-border-image: none; --wiki-content-filetoc-box-shadow: none; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; --wiki-sidebar-padding: 0px; --wiki-sidebar-background-color: var(--wiki-content-background-color); --wiki-sidebar-background-opacity: var(--wiki-content-background-opacity); --wiki-sidebar-background-image: none; --wiki-sidebar-background-position: center; --wiki-sidebar-background-repeat: repeat; --wiki-sidebar-background-size: auto; --wiki-sidebar-filter: none; --wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-sidebar-border-color: var(--wiki-content-border-color); --wiki-sidebar-border-style: solid; --wiki-sidebar-border-image: none; --wiki-sidebar-link-color: var(--wiki-content-link-color); --wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover); --wiki-sidebar-heading-color: var(--wiki-content-heading-color); --wiki-sidebar-heading-font-weight: normal; --wiki-sidebar-heading-font-style: normal; --wiki-sidebar-heading-text-transform: none; --wiki-sidebar-heading-line-height: normal; --wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem; --wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-text-shadow: none; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter); --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-box-padding: 0px; --wiki-sidebar-box-background: none; --wiki-sidebar-box-border: 0px; --wiki-sidebar-box-border-image: none; --wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color)); --wiki-footer-border-width: var(--wiki-content-border-width); --wiki-footer-border-style: var(--wiki-content-border-style); --wiki-footer-border-color: var(--wiki-content-border-color); --wiki-footer-background-color: var(--wiki-content-background-color); --wiki-footer-background-opacity: var(--wiki-content-background-opacity); --wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-footer-text-color: var(--wiki-content-text-color); --wiki-footer-link-color: var(--wiki-content-link-color); --wiki-footer-link-color--hover: var(--wiki-content-link-color--hover); --wiki-footer-border-radius: var(--wiki-content-border-radius); --wiki-navigation-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-background-color--hover: var(--wiki-navigation-background-color); --wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity); --wiki-navigation-background-image--hover: var(--wiki-navigation-background-image); --wiki-navigation-background-position--hover: var(--wiki-navigation-background-position); --wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat); --wiki-navigation-background-size--hover: var(--wiki-navigation-background-size); --wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover); --wiki-navigation-transform--hover: none; --wiki-navigation-selected-border-style: solid; --wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-border-style: solid; --wiki-navigation-border-color--hover: var(--wiki-navigation-border-color); --wiki-navigation-border-image--hover: var(--wiki-navigation-border-image); --wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style); --wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)); --wiki-navigation-icon-size: 1em; --wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x); --wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */ --wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color); --wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color); --wiki-navigation-dropdown-offset: 0px; /* vertical offset */ --wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-search-background-image: none; --wiki-navigation-search-background-position: 0; --wiki-navigation-search-background-size: auto; --wiki-navigation-search-background-repeat: repeat; --wiki-navigation-search-backdrop-filter: none; --wiki-navigation-search-border-color: var(--wiki-navigation-border-color); --wiki-navigation-search-border-color--hover: var(--wiki-accent-color); --wiki-navigation-search-border-style: solid; --wiki-navigation-search-border-width: 1px; --wiki-navigation-search-border-radius: 2px; --wiki-navigation-search-border-image: none; --wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image); --wiki-navigation-search-box-shadow: none; --wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow); --wiki-navigation-search-text-color: var(--wiki-content-text-color); --wiki-navigation-search-font-size: var(--wiki-navigation-font-size); --wiki-navigation-search-height: 2em; --wiki-navigation-search-button-color: currentColor; --wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color); --wiki-navigation-search-button-color-opacity: 80%; --wiki-navigation-search-button-color-opacity--hover: 95%; --wiki-navigation-search-bottom-spacing: 3px; --wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); --wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */ } /*** mobile adjustments ***/ @media screen and (max-width: 720px) { body.has-vector-mobile-menu{ --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-margin: 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-margin: 0px 0px -0.5em 0px; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-line-height: 1.125; --wiki-sidebar-background-opacity: 100%; --wiki-navigation-search-border-width: 1px; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; } } /***************************** **** END SHARED VARIABLES **** ******************************/ /****************************************************************************************** ********************************* End user-edit variables ********************************* ******************************************************************************************/ /****************************** * Fallback for older browsers * * DONT EDIT THIS * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .view-dark, .view-light, :root { --wiki-content-text-mix-color: var(--wiki-content-text-color); --wiki-content-text-mix-color-95: var(--wiki-content-background-color); --wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted); --wiki-content-border-color--secondary: var(--wiki-content-border-color); --wiki-content-border-color--accent: var(--wiki-accent-color); --wiki-accent-color--hover: var(--wiki-accent-color); --wiki-navigation-search-highlight-background-color: transparent; } } /***************************** * End older browser fallback * ******************************/ /***************************** * PortableInfoboxes * ******************************/ :root { --pi-background: var(--wiki-content-background-color); --pi-secondary-background: var(--wiki-accent-color); --pi-secondary-background-label: var(--wiki-accent-label-color); --pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent); } .portable-infobox .pi-title, .portable-infobox .pi-header { text-align: center; font-size: 1.5em; background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent); color: var(--pi-secondary-background-label); } .portable-infobox .pi-data, .portable-infobox .pi-group { background: var(--wiki-content-background-color--secondary); } .portable-infobox .pi-image { padding: 8px; } .pi-image-thumbnail { max-width: 100%; } .pi-caption { color: var(--wiki-content-text-mix-color); } .pi-section-navigation .pi-section-tab.pi-section-active, .pi-section-navigation .pi-section-tab.current, .pi-media-collection .pi-tab-link.current { background: var(--pi-secondary-background); color: var(--pi-secondary-background-label); } .pi-collapse > .pi-item:first-child { cursor: pointer; } /* overqualify these to overwrite normal content heading styles */ .mw-body .portable-infobox h2, .mw-body .portable-infobox h3 { border-bottom: 0; font-family: inherit; font-weight: 700; margin: 0; } /***************************** * End PortableInfoboxes * ******************************/ /******************* * Main page layout * ********************/ #mp-container { display: grid; gap: 10px; } @media screen and (max-width: 990px) { /* for mobile screens */ #mp-container { grid-template-areas:var(--main-page-layout--mobile); grid-template-columns:var(--main-page-layout-columns--mobile, 100%); } .mp-box.mp-hide-on-mobile { display: none; } } @media screen and (min-width: 990px) and (max-width: 1350px) { /* for narrow screens, between 990px and 1350px */ #mp-container { grid-template-areas:var(--main-page-layout--tablet); grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr); } .mp-box.mp-hide-on-tablet { display: none; } } @media screen and (min-width: 1350px) { /* for all other screens, 1350px and wider */ #mp-container { grid-template-areas:var(--main-page-layout--desktop); grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr); } .mp-box.mp-hide-on-desktop { display: none; } } .mp-box { position: relative; display: flex; flex-flow: column nowrap; width: 100%; box-sizing: border-box; background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent); border: 1px solid var(--wiki-content-border-color); padding: 0px; } .mp-body { height: 100%; display: flex; padding: 0.5em; flex-flow: column nowrap; } .mp-box.centered-content .mp-body { height: 100%; display: flex; flex-flow: column nowrap; justify-content: space-evenly; } .mp-box.has-floating-image { display: block; } .mp-box.has-floating-image .mp-body { height: unset; display: block; } /* overqualified to override normal heading styles */ .mw-body .mp-box h2 { text-align: center; font-weight: bold; font-family: var(--wiki-content-heading-font-family); overflow: initial; border-bottom: 1px solid var(--wiki-content-border-color); font-size: 150%; margin: 0; padding: 5px 0; color: var(--wiki-content-heading-color); } #mp-box-welcome { text-align: center; position: relative; overflow: hidden; } #mp-box-welcome h2 { font-size: 200%; } #mp-welcome { display: flex; flex-flow: column nowrap; position: relative; height: 100%; z-index: 2; box-sizing: border-box; } #mp-welcome .welcome-subtitle { height: 100%; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); padding: 0.5em; } #mp-banner { position: absolute; width: 100%; height: 100%; filter: blur(5px); z-index: -1; background: url(/images/e/e0/MP_banner.jpg); background-size: cover; background-repeat: no-repeat; background-position: top center; } .view-dark #mp-banner { filter: blur(5px) brightness(50%); } .view-light #mp-banner { filter: blur(5px) contrast(50%); } /* [[Template:MP_link]] */ .mp-links { --gap: 10px; } .mp-links > ul { display: flex; flex-flow: row wrap; justify-content: space-evenly; margin: 2px; gap: var(--gap); } .mp-links > ul > li { display: flex; flex-flow: column nowrap; align-items: stretch; text-align: center; box-sizing: border-box; flex: max(calc(50% - var(--gap)), 5em) 1 1; outline: 1px solid var(--wiki-content-link-color); transition: 0.1s ease-in; } .mp-links > ul > li:hover { background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); } .mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;} .mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;} .mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;} .mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;} .mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;} .mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;} .mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;} .mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;} .mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;} .mp-links > ul > li:hover a { text-decoration: underline; } .mp-links > ul > li > a { display: flex; align-items: center; justify-content: center; height: 100%; flex: 1 1 auto; box-sizing: border-box; padding: 5px; } .mp-links > ul > li > a:first-child { height: 100%; } .mp-links > ul > li > a:last-child:not(:first-child) { height: unset; } .mp-links.stretch, .mp-links.stretch > ul { height: 100%; } .mp-links.side-image li { flex-flow: row nowrap; } .mp-links.plain > ul > li { outline-color: transparent; } /*********************** * End main page layout * ************************/ /********************************************************************************************************************* * Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) * **********************************************************************************************************************/ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: */ .hlist dt:not(:last-child)::after { content: ":\20"; } .hlist dd:not(:last-child)::after, .hlist li:not(:last-child)::after { /* "space, Middle Dot, space" We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters. The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */ /* content: "\20\00B7\20"; font-weight: bold; */ /* "space &nbsp; • &nbsp; space" There may (and likely) be an extra whitespace between <li>s, therefore we have to use a space character as last character of this sequence. By this way, the last space and the next whitespce will collapse as a single space, to make the whitespace on both sides of the middle dot the same width. */ content: "\20\A0\2022\A0\20"; font-weight: inherit; } /* Add parentheses around nested lists */ .hlist dd ol::before, .hlist dd ul::before, .hlist dd dl::before, .hlist dt ol::before, .hlist dt ul::before, .hlist dt dl::before, .hlist li ol::before, .hlist li ul::before, .hlist li dl::before { content: "\20("; font-weight: inherit; } .hlist dd ol::after, .hlist dd ul::after, .hlist dd dl::after, .hlist dt ol::after, .hlist dt ul::after, .hlist dt dl::after, .hlist li ol::after, .hlist li ul::after, .hlist li dl::after { content: ")"; font-weight: inherit; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) ".\20"; } /* Progressive enhancement: * try to make the dot always follow the list item in same line */ .hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) { display: inline-block; } /******************************************** * End semantically-correct horizontal lists * *********************************************/ /*** Miscellaneous ***/ .responsive-image { max-width: 100%; height: auto; } .view-dark .invert-on-dark, .view-light .invert-on-light { filter: invert(100%); } .pixelated { image-rendering: pixelated; } @media screen and (min-width: 720px) { .mobileonly { display: none; } } @media screen and (max-width: 720px) { .nomobile { display: none; } } /*** Utility classes for standard MW galleries ***/ /* it's important that spaced comes before centered in the sheet */ .gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */ display: flex; flex-flow: row wrap; justify-content: space-evenly; margin-left: unset; } .gallery.centered { text-align: center; } /************************** * Start Modular Templates * **************************/ /********* [[Template:Ambox]] *********/ .ambox { --ambox-color: var(--wiki-accent-color); border: 1px solid var(--wiki-content-border-color); border-left: 10px solid var(--ambox-color); border-radius: 2px; display: flex; align-items: center; gap: .6em; margin: 1em 0; padding: 3px .6em; background-color: var(--wiki-content-background-color--secondary); box-shadow: 2px 2px 5px 0px #0002; } @media (min-width: 720px) { .ambox { margin-inline: 10%; } } .ambox.tiny { padding: .04rem .5em; margin-inline: 0; width: fit-content; } .ambox + .ambox { margin-top: -.6em; } .ambox-content { flex: 1; } .ambox-content p { margin: .15em 0; } .ambox-title { font-weight: bold; } /********* [[Template:Hatnote]] *********/ .hatnote { padding: 1px 0 1px 1.6em; margin-bottom: 0.5em; font-style: italic; border-top: 1px solid var(--wiki-content-border-color--secondary); border-bottom: 1px solid var(--wiki-content-border-color--secondary); } .hatnote.icon { padding-left: 0; } /********* [[Template:Spoiler]] *********/ .spoiler-content { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent); transition: all 0.3s; cursor: pointer; overflow: auto; } @supports not (color:color-mix(in srgb, #000, transparent)) { .spoiler-content { background-color: var(--wiki-content-dynamic-color--secondary); } } .spoiler-content > * { pointer-events: none; opacity: 0; transition: all 0.3s; } .spoiler-content.show { background-color: transparent; } .spoiler-content.show > * { pointer-events: unset; opacity: 1; } /********* [[Template:Link icon]] *********/ .link-icon { --link-icon-line-height: 1.5em; --link-icon-size: 1.5em; display: inline-flex; align-items: center; height: var(--link-icon-line-height); vertical-align: bottom; } .link-icon .regular { align-self: center; } .link-icon .regular a { display: flex; } .link-icon .regular img { height: var(--link-icon-size); max-width: var(--link-icon-size); } .link-icon .fallback { outline: 1px solid var(--wiki-content-text-color); border-radius: 50%; text-align: center; width: var(--link-icon-size); line-height: var(--link-icon-size); } .link-icon.notext, .link-icon.notext .fallback { display: inline-block; } /********* [[Template:Quote]] *********/ .quote { background: var(--wiki-content-background-color--secondary); border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: .5em 0; padding: .5em; overflow-y: hidden; } .quote .block { display: block; } .quote .title { font-size: large; font-weight: bold; } .quote .content { font-style: italic; } .quote .author { font-weight: bold; text-align: end; } .quote .marks-wrapper { display: flex; gap: 5px; } .quote .marks-wrapper::before, .quote .marks-wrapper::after { font-size: 100px; line-height: 0px; } .quote .marks-wrapper::before { content: "\201C"; margin-top: 40px; } .quote .marks-wrapper::after { content: "\201D"; align-self: end; margin-bottom: -10px; } .client-js .mw-charinsert-item { display: none; } /************************ * End Modular Templates * *************************/ /***************************** * Used by [[Template:Color]] * ******************************/ .color__splotch { display: inline-block; height: 1em; width: 1em; box-sizing: border-box; vertical-align: text-top; border-radius: 50%; border: 1px solid var(--wiki-content-text-color); } /********************* * End Template:Color * **********************/ /********************************* * Used by [[Template:TOC limit]] * **********************************/ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /************************* * End Template:TOC limit * **************************/ /********************************* * Used by [[Template:TOC right]] * **********************************/ @media all and (min-width: 720px) { .tocright { float: right; clear: right; margin: 0 0 0.5em 1em; } } /************************* * End Template:TOC right * **************************/ 23b1aa2ed7d9d5de6f1c3b3f7f2d01379b0f3907 1331 1330 2025-08-23T16:49:46Z Sharparam 284703 Adjust content border color for dark theme css text/css /* CSS placed here will be applied to all skins */ /****************************************************************************************** ********************************* Start user-edit variables ******************************* ******************************************************************************************/ /***************************************** ****** START BASIC DESIGN VARIABLES ****** ----------------------------------------*/ :root { --wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif; --wiki-sidebar-heading-font-family: sans-serif; --wiki-content-border-radius: 0px; --wiki-sidebar-border-radius: 0px; } /*---------------------------------------- ******* END BASIC DESIGN VARIABLES ******* *****************************************/ /***************************************** ****** START BASIC COLOR VARIABLES ******* ----------------------------------------*/ :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-content-background-color: #ffffff; --wiki-content-background-opacity: 100%; --wiki-content-border-color: #a7d7f9; --wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ LIGHT VIEW ] */ --wiki-accent-color: #3366cc; --wiki-accent-label-color: #ffffff; --wiki-accent-link-color: #D5FB51; --wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* end light styles */ /* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=dark, */ /* individual themes are prefixed with .theme- instead */ .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); --wiki-content-background-color: #202020; --wiki-content-background-opacity: 90%; /* DEFAULT: --wiki-content-border-color: #991A51; */ --wiki-content-border-color: hsl(0deg 0% 30%); --wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ DARK VIEW ] */ /* DEFAULT: --wiki-accent-color: #ff4d9d; */ --wiki-accent-color: hsl(0deg 0% 75%); --wiki-accent-label-color: #000; --wiki-accent-link-color: #1e1e43; --wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* End dark styles */ /*---------------------------------------- ******* END BASIC COLOR VARIABLES ******** *****************************************/ /***************************************** **** START ADVANCED COLOR VARIABLES ****** ----------------------------------------*/ :root, .view-light { /******************* * Maybe edit these * [ LIGHT VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #111111; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #ba0000; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ LIGHT VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ LIGHT VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #bf0017; --wiki-warning-color: #b05f30; --wiki-success-color: #0c742f; /**/ /*********************************** * Likely do not need to edit these * [ LIGHT VIEW ] ************************************/ --wiki-body-dynamic-color: #000000; --wiki-body-dynamic-color--inverted: #ffffff; --wiki-body-dynamic-color--secondary: #333333; --wiki-body-dynamic-color--secondary--inverted: #cccccc; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #ffffff; --wiki-content-dynamic-color: #000000; --wiki-content-dynamic-color--inverted: #ffffff; --wiki-content-dynamic-color--secondary: #333333; --wiki-content-dynamic-color--secondary--inverted: #cccccc; /* [ LIGHT VIEW ] */ --wiki-alert-label-color: #ffffff; --wiki-warning-label-color: #ffffff; --wiki-success-label-color: #ffffff; --wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */ /**/ } .view-dark { /******************* * Maybe edit these * [ DARK VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #ededed; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #FC5B4F; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ DARK VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ DARK VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #ff576a; --wiki-warning-color: #cf721c; --wiki-success-color: #13aa45; /**/ /*********************************** * Likely do not need to edit these * [ DARK VIEW ] ************************************/ --wiki-body-dynamic-color: #ffffff; --wiki-body-dynamic-color--inverted: #000000; --wiki-body-dynamic-color--secondary: #cccccc; --wiki-body-dynamic-color--secondary--inverted: #333333; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #000; --wiki-content-dynamic-color: #ffffff; --wiki-content-dynamic-color--inverted: #000000; --wiki-content-dynamic-color--secondary: #cccccc; --wiki-content-dynamic-color--secondary--inverted: #333333; /* [ DARK VIEW ] */ --wiki-alert-label-color: #000000; --wiki-warning-label-color: #000000; --wiki-success-label-color: #000000; --wiki-icon-general-filter: invert(100%); } /*---------------------------------------- ***** END ADVANCED COLOR VARIABLES ******* *****************************************/ /***************************************** **** START ADVANCED DESIGN VARIABLES ***** ----------------------------------------*/ :root { /*********************** start logo position ----------------------*/ --wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */ --wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */ --wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */ --wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */ --wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */ /*----------------------- end logo position ***********************/ --wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */ --wiki-body-font-family: sans-serif; --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */ /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-width: 1px; --wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */ --wiki-sidebar-portal-spacing: 0px; --wiki-sidebar-border-width: var(--wiki-content-border-width); --wiki-navigation-border-radius: 0px; /* border radius of tabs */ /******************* * Maybe edit these * [ DESIGN ] ********************/ --wiki-logo-filter: none; /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-top-radius: var(--wiki-content-border-radius); --wiki-content-border-style: solid; --wiki-content-border-image: none; --wiki-content-backdrop-filter: none; --wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */ --wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */ --wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-line-height: 1.125; --wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-margin: 0.5em; --wiki-sidebar-list-item-padding: 0.25em 0.25rem; --wiki-sidebar-list-padding: 0.25rem; --wiki-sidebar-list-item-background--hover: none; /* background of hover item */ --wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */ --wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */ --wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-box-background-color: var(--wiki-content-background-color); --wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content)); --wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ --wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ /* nav tabs style. The vector gradient is default. * If you want to customize the style of tabs, it's easier to start with the following settings: * --wiki-navigation-background-image: none; * --wiki-navigation-selected-background-image: none; * --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px ); * --wiki-navigation-selected-border-bottom-background: none; * --wiki-navigation-tab-spacing: 0.25em; * --wiki-navigation-tab-padding-top: 0.5em; * --wiki-navigation-tab-padding-bottom: 0.5em; */ --wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */ --wiki-navigation-tab-padding-top: 1.25em; --wiki-navigation-tab-padding-x: 0.75em; --wiki-navigation-tab-padding-bottom: 4px; --wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */ --wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */ --wiki-navigation-border-image: none; --wiki-navigation-selected-border-image: var(--wiki-navigation-border-image); --wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%); --wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x; --wiki-navigation-background-position: left bottom, right bottom, left bottom; --wiki-navigation-background-size: 1px 100%, 1px 100%, 100%; --wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%); --wiki-navigation-selected-background-repeat: no-repeat, no-repeat; --wiki-navigation-selected-background-position: left bottom, right bottom; --wiki-navigation-selected-background-size: 1px 100%, 1px 100%; --wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px); /* affects the dropdown menu under More */ --wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color); --wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color); --wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */ --wiki-navigation-dropdown-border-width: 1px; --wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius); --wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */ --wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */ --wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */ --wiki-navigation-dropdown-border-image: none; --wiki-navigation-dropdown-backdrop-filter: none; --wiki-navigation-dropdown-box-shadow: none; /* box shadow */ /* styles of the footer */ --wiki-spacing-before-footer: 0px; --wiki-footer-border-image: none; /* padding on body element */ --wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */ --wiki-left-spacing: 0.5em; --wiki-right-spacing: 1em; --wiki-bottom-spacing: 2em; /* end design variables */ } /*---------------------------------------- ***** END ADVANCED DESIGN VARIABLES ****** *****************************************/ /******************************* **** START SHARED VARIABLES **** **** tl;dr: don't edit this **** ********************************/ /* These variables are rarely touched, usually inherit other variables, and are shared on all themes. In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision, understand what you are doing, and *know* that what you are trying to do is not accomplished by changing another variable in the above sections. Since these are by default shared across all themes, if you support multiple themes you'll probably want to separate the variables you want to modify here into .view-x blocks like above. If you don't understand what that means or how to do that then you probably shouldn't be modifying this section. */ :root { --wiki-content-border-bottom-width: var(--wiki-content-border-width); --wiki-content-border-bottom-style: var(--wiki-content-border-style); --wiki-content-border-bottom-color: var(--wiki-content-border-color); --wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%); --wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color)); --wiki-content-text-color--hover: var(--wiki-content-text-color); /* heading */ --wiki-content-heading-border-bottom-width: 1px; --wiki-content-heading-border-style: solid; --wiki-content-heading-font-weight: normal; --wiki-content-heading-font-style: normal; --wiki-content-heading-text-transform: none; --wiki-content-heading-line-height: normal; --wiki-content-heading-text-shadow: none; /* first heading (h1) */ --wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width); --wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); --wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight); --wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style); --wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform); --wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-firstheading-color: var(--wiki-content-heading-color); --wiki-content-firstheading-text-shadow: none; /* sub-heading (h3, h4, h5, h6) */ --wiki-content-subheading-border-bottom-width: 0px; --wiki-content-subheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-subheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-subheading-font-family: var(--wiki-body-font-family); --wiki-content-subheading-font-weight: bold; --wiki-content-subheading-font-style: normal; --wiki-content-subheading-text-transform: none; --wiki-content-subheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-subheading-color: var(--wiki-content-heading-color); --wiki-content-subheading-text-shadow: none; /* heading size */ --wiki-content-firstheading-font-size: 1.8em; --wiki-content-heading-h2-font-size: 1.5em; --wiki-content-heading-h3-font-size: 1.2em; --wiki-content-heading-h4-font-size: 114%; --wiki-content-heading-h5-font-size: 108%; --wiki-content-heading-h6-font-size: 100%; --wiki-content-toc-background: var(--wiki-content-background-color--secondary); --wiki-content-toc-border-width: 1px; --wiki-content-toc-border-style: solid; --wiki-content-toc-border-color: var(--wiki-content-border-color); --wiki-content-toc-border-radius: 0px; --wiki-content-toc-border-image: none; --wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000; --wiki-content-catlinks-background: var(--wiki-content-background-color--secondary); --wiki-content-catlinks-border-width: 1px; --wiki-content-catlinks-border-style: solid; --wiki-content-catlinks-border-color: var(--wiki-content-border-color); --wiki-content-catlinks-border-radius: 0px; --wiki-content-catlinks-border-image: none; --wiki-content-catlinks-box-shadow: none; --wiki-content-filetoc-background: var(--wiki-content-background-color--secondary); --wiki-content-filetoc-border-width: 1px; --wiki-content-filetoc-border-style: solid; --wiki-content-filetoc-border-color: var(--wiki-content-border-color); --wiki-content-filetoc-border-radius: 0px; --wiki-content-filetoc-border-image: none; --wiki-content-filetoc-box-shadow: none; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; --wiki-sidebar-padding: 0px; --wiki-sidebar-background-color: var(--wiki-content-background-color); --wiki-sidebar-background-opacity: var(--wiki-content-background-opacity); --wiki-sidebar-background-image: none; --wiki-sidebar-background-position: center; --wiki-sidebar-background-repeat: repeat; --wiki-sidebar-background-size: auto; --wiki-sidebar-filter: none; --wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-sidebar-border-color: var(--wiki-content-border-color); --wiki-sidebar-border-style: solid; --wiki-sidebar-border-image: none; --wiki-sidebar-link-color: var(--wiki-content-link-color); --wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover); --wiki-sidebar-heading-color: var(--wiki-content-heading-color); --wiki-sidebar-heading-font-weight: normal; --wiki-sidebar-heading-font-style: normal; --wiki-sidebar-heading-text-transform: none; --wiki-sidebar-heading-line-height: normal; --wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem; --wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-text-shadow: none; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter); --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-box-padding: 0px; --wiki-sidebar-box-background: none; --wiki-sidebar-box-border: 0px; --wiki-sidebar-box-border-image: none; --wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color)); --wiki-footer-border-width: var(--wiki-content-border-width); --wiki-footer-border-style: var(--wiki-content-border-style); --wiki-footer-border-color: var(--wiki-content-border-color); --wiki-footer-background-color: var(--wiki-content-background-color); --wiki-footer-background-opacity: var(--wiki-content-background-opacity); --wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-footer-text-color: var(--wiki-content-text-color); --wiki-footer-link-color: var(--wiki-content-link-color); --wiki-footer-link-color--hover: var(--wiki-content-link-color--hover); --wiki-footer-border-radius: var(--wiki-content-border-radius); --wiki-navigation-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-background-color--hover: var(--wiki-navigation-background-color); --wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity); --wiki-navigation-background-image--hover: var(--wiki-navigation-background-image); --wiki-navigation-background-position--hover: var(--wiki-navigation-background-position); --wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat); --wiki-navigation-background-size--hover: var(--wiki-navigation-background-size); --wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover); --wiki-navigation-transform--hover: none; --wiki-navigation-selected-border-style: solid; --wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-border-style: solid; --wiki-navigation-border-color--hover: var(--wiki-navigation-border-color); --wiki-navigation-border-image--hover: var(--wiki-navigation-border-image); --wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style); --wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)); --wiki-navigation-icon-size: 1em; --wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x); --wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */ --wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color); --wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color); --wiki-navigation-dropdown-offset: 0px; /* vertical offset */ --wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-search-background-image: none; --wiki-navigation-search-background-position: 0; --wiki-navigation-search-background-size: auto; --wiki-navigation-search-background-repeat: repeat; --wiki-navigation-search-backdrop-filter: none; --wiki-navigation-search-border-color: var(--wiki-navigation-border-color); --wiki-navigation-search-border-color--hover: var(--wiki-accent-color); --wiki-navigation-search-border-style: solid; --wiki-navigation-search-border-width: 1px; --wiki-navigation-search-border-radius: 2px; --wiki-navigation-search-border-image: none; --wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image); --wiki-navigation-search-box-shadow: none; --wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow); --wiki-navigation-search-text-color: var(--wiki-content-text-color); --wiki-navigation-search-font-size: var(--wiki-navigation-font-size); --wiki-navigation-search-height: 2em; --wiki-navigation-search-button-color: currentColor; --wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color); --wiki-navigation-search-button-color-opacity: 80%; --wiki-navigation-search-button-color-opacity--hover: 95%; --wiki-navigation-search-bottom-spacing: 3px; --wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); --wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */ } /*** mobile adjustments ***/ @media screen and (max-width: 720px) { body.has-vector-mobile-menu{ --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-margin: 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-margin: 0px 0px -0.5em 0px; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-line-height: 1.125; --wiki-sidebar-background-opacity: 100%; --wiki-navigation-search-border-width: 1px; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; } } /***************************** **** END SHARED VARIABLES **** ******************************/ /****************************************************************************************** ********************************* End user-edit variables ********************************* ******************************************************************************************/ /****************************** * Fallback for older browsers * * DONT EDIT THIS * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .view-dark, .view-light, :root { --wiki-content-text-mix-color: var(--wiki-content-text-color); --wiki-content-text-mix-color-95: var(--wiki-content-background-color); --wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted); --wiki-content-border-color--secondary: var(--wiki-content-border-color); --wiki-content-border-color--accent: var(--wiki-accent-color); --wiki-accent-color--hover: var(--wiki-accent-color); --wiki-navigation-search-highlight-background-color: transparent; } } /***************************** * End older browser fallback * ******************************/ /***************************** * PortableInfoboxes * ******************************/ :root { --pi-background: var(--wiki-content-background-color); --pi-secondary-background: var(--wiki-accent-color); --pi-secondary-background-label: var(--wiki-accent-label-color); --pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent); } .portable-infobox .pi-title, .portable-infobox .pi-header { text-align: center; font-size: 1.5em; background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent); color: var(--pi-secondary-background-label); } .portable-infobox .pi-data, .portable-infobox .pi-group { background: var(--wiki-content-background-color--secondary); } .portable-infobox .pi-image { padding: 8px; } .pi-image-thumbnail { max-width: 100%; } .pi-caption { color: var(--wiki-content-text-mix-color); } .pi-section-navigation .pi-section-tab.pi-section-active, .pi-section-navigation .pi-section-tab.current, .pi-media-collection .pi-tab-link.current { background: var(--pi-secondary-background); color: var(--pi-secondary-background-label); } .pi-collapse > .pi-item:first-child { cursor: pointer; } /* overqualify these to overwrite normal content heading styles */ .mw-body .portable-infobox h2, .mw-body .portable-infobox h3 { border-bottom: 0; font-family: inherit; font-weight: 700; margin: 0; } /***************************** * End PortableInfoboxes * ******************************/ /******************* * Main page layout * ********************/ #mp-container { display: grid; gap: 10px; } @media screen and (max-width: 990px) { /* for mobile screens */ #mp-container { grid-template-areas:var(--main-page-layout--mobile); grid-template-columns:var(--main-page-layout-columns--mobile, 100%); } .mp-box.mp-hide-on-mobile { display: none; } } @media screen and (min-width: 990px) and (max-width: 1350px) { /* for narrow screens, between 990px and 1350px */ #mp-container { grid-template-areas:var(--main-page-layout--tablet); grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr); } .mp-box.mp-hide-on-tablet { display: none; } } @media screen and (min-width: 1350px) { /* for all other screens, 1350px and wider */ #mp-container { grid-template-areas:var(--main-page-layout--desktop); grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr); } .mp-box.mp-hide-on-desktop { display: none; } } .mp-box { position: relative; display: flex; flex-flow: column nowrap; width: 100%; box-sizing: border-box; background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent); border: 1px solid var(--wiki-content-border-color); padding: 0px; } .mp-body { height: 100%; display: flex; padding: 0.5em; flex-flow: column nowrap; } .mp-box.centered-content .mp-body { height: 100%; display: flex; flex-flow: column nowrap; justify-content: space-evenly; } .mp-box.has-floating-image { display: block; } .mp-box.has-floating-image .mp-body { height: unset; display: block; } /* overqualified to override normal heading styles */ .mw-body .mp-box h2 { text-align: center; font-weight: bold; font-family: var(--wiki-content-heading-font-family); overflow: initial; border-bottom: 1px solid var(--wiki-content-border-color); font-size: 150%; margin: 0; padding: 5px 0; color: var(--wiki-content-heading-color); } #mp-box-welcome { text-align: center; position: relative; overflow: hidden; } #mp-box-welcome h2 { font-size: 200%; } #mp-welcome { display: flex; flex-flow: column nowrap; position: relative; height: 100%; z-index: 2; box-sizing: border-box; } #mp-welcome .welcome-subtitle { height: 100%; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); padding: 0.5em; } #mp-banner { position: absolute; width: 100%; height: 100%; filter: blur(5px); z-index: -1; background: url(/images/e/e0/MP_banner.jpg); background-size: cover; background-repeat: no-repeat; background-position: top center; } .view-dark #mp-banner { filter: blur(5px) brightness(50%); } .view-light #mp-banner { filter: blur(5px) contrast(50%); } /* [[Template:MP_link]] */ .mp-links { --gap: 10px; } .mp-links > ul { display: flex; flex-flow: row wrap; justify-content: space-evenly; margin: 2px; gap: var(--gap); } .mp-links > ul > li { display: flex; flex-flow: column nowrap; align-items: stretch; text-align: center; box-sizing: border-box; flex: max(calc(50% - var(--gap)), 5em) 1 1; outline: 1px solid var(--wiki-content-link-color); transition: 0.1s ease-in; } .mp-links > ul > li:hover { background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); } .mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;} .mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;} .mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;} .mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;} .mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;} .mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;} .mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;} .mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;} .mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;} .mp-links > ul > li:hover a { text-decoration: underline; } .mp-links > ul > li > a { display: flex; align-items: center; justify-content: center; height: 100%; flex: 1 1 auto; box-sizing: border-box; padding: 5px; } .mp-links > ul > li > a:first-child { height: 100%; } .mp-links > ul > li > a:last-child:not(:first-child) { height: unset; } .mp-links.stretch, .mp-links.stretch > ul { height: 100%; } .mp-links.side-image li { flex-flow: row nowrap; } .mp-links.plain > ul > li { outline-color: transparent; } /*********************** * End main page layout * ************************/ /********************************************************************************************************************* * Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) * **********************************************************************************************************************/ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: */ .hlist dt:not(:last-child)::after { content: ":\20"; } .hlist dd:not(:last-child)::after, .hlist li:not(:last-child)::after { /* "space, Middle Dot, space" We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters. The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */ /* content: "\20\00B7\20"; font-weight: bold; */ /* "space &nbsp; • &nbsp; space" There may (and likely) be an extra whitespace between <li>s, therefore we have to use a space character as last character of this sequence. By this way, the last space and the next whitespce will collapse as a single space, to make the whitespace on both sides of the middle dot the same width. */ content: "\20\A0\2022\A0\20"; font-weight: inherit; } /* Add parentheses around nested lists */ .hlist dd ol::before, .hlist dd ul::before, .hlist dd dl::before, .hlist dt ol::before, .hlist dt ul::before, .hlist dt dl::before, .hlist li ol::before, .hlist li ul::before, .hlist li dl::before { content: "\20("; font-weight: inherit; } .hlist dd ol::after, .hlist dd ul::after, .hlist dd dl::after, .hlist dt ol::after, .hlist dt ul::after, .hlist dt dl::after, .hlist li ol::after, .hlist li ul::after, .hlist li dl::after { content: ")"; font-weight: inherit; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) ".\20"; } /* Progressive enhancement: * try to make the dot always follow the list item in same line */ .hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) { display: inline-block; } /******************************************** * End semantically-correct horizontal lists * *********************************************/ /*** Miscellaneous ***/ .responsive-image { max-width: 100%; height: auto; } .view-dark .invert-on-dark, .view-light .invert-on-light { filter: invert(100%); } .pixelated { image-rendering: pixelated; } @media screen and (min-width: 720px) { .mobileonly { display: none; } } @media screen and (max-width: 720px) { .nomobile { display: none; } } /*** Utility classes for standard MW galleries ***/ /* it's important that spaced comes before centered in the sheet */ .gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */ display: flex; flex-flow: row wrap; justify-content: space-evenly; margin-left: unset; } .gallery.centered { text-align: center; } /************************** * Start Modular Templates * **************************/ /********* [[Template:Ambox]] *********/ .ambox { --ambox-color: var(--wiki-accent-color); border: 1px solid var(--wiki-content-border-color); border-left: 10px solid var(--ambox-color); border-radius: 2px; display: flex; align-items: center; gap: .6em; margin: 1em 0; padding: 3px .6em; background-color: var(--wiki-content-background-color--secondary); box-shadow: 2px 2px 5px 0px #0002; } @media (min-width: 720px) { .ambox { margin-inline: 10%; } } .ambox.tiny { padding: .04rem .5em; margin-inline: 0; width: fit-content; } .ambox + .ambox { margin-top: -.6em; } .ambox-content { flex: 1; } .ambox-content p { margin: .15em 0; } .ambox-title { font-weight: bold; } /********* [[Template:Hatnote]] *********/ .hatnote { padding: 1px 0 1px 1.6em; margin-bottom: 0.5em; font-style: italic; border-top: 1px solid var(--wiki-content-border-color--secondary); border-bottom: 1px solid var(--wiki-content-border-color--secondary); } .hatnote.icon { padding-left: 0; } /********* [[Template:Spoiler]] *********/ .spoiler-content { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent); transition: all 0.3s; cursor: pointer; overflow: auto; } @supports not (color:color-mix(in srgb, #000, transparent)) { .spoiler-content { background-color: var(--wiki-content-dynamic-color--secondary); } } .spoiler-content > * { pointer-events: none; opacity: 0; transition: all 0.3s; } .spoiler-content.show { background-color: transparent; } .spoiler-content.show > * { pointer-events: unset; opacity: 1; } /********* [[Template:Link icon]] *********/ .link-icon { --link-icon-line-height: 1.5em; --link-icon-size: 1.5em; display: inline-flex; align-items: center; height: var(--link-icon-line-height); vertical-align: bottom; } .link-icon .regular { align-self: center; } .link-icon .regular a { display: flex; } .link-icon .regular img { height: var(--link-icon-size); max-width: var(--link-icon-size); } .link-icon .fallback { outline: 1px solid var(--wiki-content-text-color); border-radius: 50%; text-align: center; width: var(--link-icon-size); line-height: var(--link-icon-size); } .link-icon.notext, .link-icon.notext .fallback { display: inline-block; } /********* [[Template:Quote]] *********/ .quote { background: var(--wiki-content-background-color--secondary); border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: .5em 0; padding: .5em; overflow-y: hidden; } .quote .block { display: block; } .quote .title { font-size: large; font-weight: bold; } .quote .content { font-style: italic; } .quote .author { font-weight: bold; text-align: end; } .quote .marks-wrapper { display: flex; gap: 5px; } .quote .marks-wrapper::before, .quote .marks-wrapper::after { font-size: 100px; line-height: 0px; } .quote .marks-wrapper::before { content: "\201C"; margin-top: 40px; } .quote .marks-wrapper::after { content: "\201D"; align-self: end; margin-bottom: -10px; } .client-js .mw-charinsert-item { display: none; } /************************ * End Modular Templates * *************************/ /***************************** * Used by [[Template:Color]] * ******************************/ .color__splotch { display: inline-block; height: 1em; width: 1em; box-sizing: border-box; vertical-align: text-top; border-radius: 50%; border: 1px solid var(--wiki-content-text-color); } /********************* * End Template:Color * **********************/ /********************************* * Used by [[Template:TOC limit]] * **********************************/ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /************************* * End Template:TOC limit * **************************/ /********************************* * Used by [[Template:TOC right]] * **********************************/ @media all and (min-width: 720px) { .tocright { float: right; clear: right; margin: 0 0 0.5em 1em; } } /************************* * End Template:TOC right * **************************/ 8f19edf92250384883dd722759a3a6d86ee3ba9d Meta:Manual of Style 4 845 1332 2025-08-24T20:03:40Z Sharparam 284703 Created page with "This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the talk page or contact wiki administrators to have it clarified. [[Category:Manual of Style]]" wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the talk page or contact wiki administrators to have it clarified. [[Category:Manual of Style]] 0ef107d5084b9b99be53e446a3db2a66c809da2a 1335 1332 2025-08-24T20:07:30Z Sharparam 284703 Link to talk page wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. [[Category:Manual of Style]] e4e851f69ebaf087f36e360a8060865c9f4b2c2b 1348 1335 2025-08-24T23:25:02Z Sharparam 284703 Add more style guides wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) * Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. [[Category:Manual of Style]] e6b0a8e76f3bd612c0987af6b3e48281d113fd51 Category:Manual of Style 14 846 1333 2025-08-24T20:04:01Z Sharparam 284703 Created page with "Pages that deal with how the wiki should be edited." wikitext text/x-wiki Pages that deal with how the wiki should be edited. da899e150d93b28ad3a19c1041ade0e77fccf87f Meta:MOS 4 847 1334 2025-08-24T20:04:18Z Sharparam 284703 Redirected page to [[Meta:Manual of Style]] wikitext text/x-wiki #REDIRECT [[Meta:Manual of Style]] 918040eed385668d250445cc55d1b1824e0ed37a Template:Em 10 848 1336 2025-08-24T22:26:46Z Sharparam 284703 Created page with "<em {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</em><noinclude> {{documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude>" wikitext text/x-wiki <em {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</em><noinclude> {{documentation}} <!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude> e2fac6fb507a0dd72c4e79d02403049c7d857c8d Template:Em/doc 10 849 1337 2025-08-24T22:28:04Z Sharparam 284703 Created page with "{{From Wikipedia|Template:Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki {{From Wikipedia|Template:Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> a4d16d9316831955f3ae49005df6a9d14e7744c4 1338 1337 2025-08-24T22:29:10Z Sharparam 284703 Add link to strong template wikitext text/x-wiki {{From Wikipedia|Template:Em}} == See also == * {{tl|Strong}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> fae59b458997baf767095a83a6812fac25576f9b Template:Strong 10 850 1339 2025-08-24T22:29:18Z Sharparam 284703 Created page with "<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude>" wikitext text/x-wiki <strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude> a6c6d3b520e2018e19376e2f0e1a72801336d1df Template:Strong/doc 10 851 1340 2025-08-24T22:30:06Z Sharparam 284703 Created page with "{{From Wikipedia|Template:Strong}} == See also == * {{tl|Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki {{From Wikipedia|Template:Strong}} == See also == * {{tl|Em}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 8b5e840a9e0f743fb68890c95e23a65f1d450d3b Bleak Faith: Forsaken Wiki/contribute 0 7 1341 13 2025-08-24T22:32:04Z Sharparam 284703 Add link to manual of style wikitext text/x-wiki {{Main page box/start | title = Contribute to the wiki }} {{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players. ; Adding content :* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done. :* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough. :* [[Special:UserLogin/signup|Register]] to edit and track your contributions. :* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> fcb3d3f242ca0c4dad471938bb505c27594f44ad Template:Tag 10 852 1342 2025-08-24T22:37:47Z Sharparam 284703 Copied from [[wikipedia:Template:Tag]] (edit link to use Wikipedia interwiki link) wikitext text/x-wiki <code class="{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}" style="{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;|{{{style|}}}}}"><!-- Opening tag -->{{#switch:{{{2|pair}}} |c|close = |e|empty|s|single|v|void |o|open |p|pair = &lt;{{#if:{{{link|}}}|[[wikipedia:HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}|&#32;{{{params|{{{attribs}}}}}}}} }}<!-- Content between tags -->{{#switch:{{{2|pair}}} |c|close = {{{content|}}} |e|empty|s|single|v|void = &#32;&#47;&gt; |o|open = &gt;{{{content|}}} |p|pair = {{#ifeq:{{{1|tag}}}|!--||&gt;}}{{{content|...}}} }}<!-- Closing tag -->{{#switch:{{{2|pair}}} |e|empty|s|single|v|void |o|open = |c|close |p|pair = {{#ifeq:{{{1|tag}}}|!--|--&gt;|&lt;&#47;{{{1|tag}}}&gt;}} }}<!-- --></code><noinclude> {{Documentation}} </noinclude> 973b72505c3ff83d502ce65f4b01269686bdafc1 Template:Tag/doc 10 853 1343 2025-08-24T22:38:55Z Sharparam 284703 Created page with "{{From Wikipedia|Template:Tag}} <includeonly>{{Sandbox other||[[Category:HTML typing-aid templates]][[Category:Wikitext typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki {{From Wikipedia|Template:Tag}} <includeonly>{{Sandbox other||[[Category:HTML typing-aid templates]][[Category:Wikitext typing-aid templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 9e7ec019dcd1a7dcedc4eef709120806464b2bee Category:HTML typing-aid templates 14 854 1344 2025-08-24T22:39:09Z Sharparam 284703 Created page with "[[Category:Templates]]" wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Wikitext typing-aid templates 14 855 1345 2025-08-24T22:39:21Z Sharparam 284703 Created page with "[[Category:Templates]]" wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Template:Infobox/NPC/doc 10 344 1346 457 2025-08-24T23:11:14Z Sharparam 284703 Fix broken image wikitext text/x-wiki == Example == {{Infobox/NPC | title = The Handler | image = The Handler Blok 6147.png }} <syntaxhighlight lang="wikitext"> {{Infobox/NPC | title = The Handler | image = The Handler.png }} </syntaxhighlight> <includeonly>{{Sandbox other|| [[Category:Infobox templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 11eea2529a7b33998b60fe9dc8a39e661285dbec 1347 1346 2025-08-24T23:11:28Z Sharparam 284703 Fix outdated example wikitext text/x-wiki == Example == {{Infobox/NPC | title = The Handler | image = The Handler Blok 6147.png }} <syntaxhighlight lang="wikitext"> {{Infobox/NPC | title = The Handler | image = The Handler Blok 6147.png }} </syntaxhighlight> <includeonly>{{Sandbox other|| [[Category:Infobox templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 89dc6ffb6ff9ad6917d700875e0a4146d07be538 Template:DiscordLink 10 856 1349 2025-08-24T23:45:30Z Sharparam 284703 Created page with "{{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}} {{#vardefine:text|{{{text|Discord}}}}} {{#vardefine:icon|{{Yesno|{{{icon|}}}}}}} {{#switch:{{{1}}} | plain = {{#var:url}} | #default = {{#if:{{#var:icon}} | <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!-- --><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!-- --><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!-- --><..." wikitext text/x-wiki {{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}} {{#vardefine:text|{{{text|Discord}}}}} {{#vardefine:icon|{{Yesno|{{{icon|}}}}}}} {{#switch:{{{1}}} | plain = {{#var:url}} | #default = {{#if:{{#var:icon}} | <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!-- --><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!-- --><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!-- --></span> | [{{#var:url}} {{#var:text}}] }} }}<noinclude>{{Documentation}}</noinclude> cfefd5d3e9f55f72e09ed3338722bdc34a9c4424 1351 1349 2025-08-24T23:54:36Z Sharparam 284703 Fix spacing and newlines wikitext text/x-wiki {{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}}<!-- -->{{#vardefine:text|{{{text|Discord}}}}}<!-- -->{{#vardefine:icon|{{Yesno|{{{icon|}}}}}}}<!-- -->{{#switch:{{{1}}} | plain = {{#var:url}} | #default = {{#if:{{#var:icon}} | <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!-- --><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!-- -->&nbsp;<!-- --><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!-- --></span> | [{{#var:url}} {{#var:text}}] }} }}<noinclude>{{Documentation}}</noinclude> c1e0c2547c9b5f013780e23c397049d7bdcc1170 Template:DiscordLink/doc 10 857 1350 2025-08-24T23:52:42Z Sharparam 284703 Created page with "== TemplateData == <templatedata> { "params": { "1": { "label": "Type", "description": "Type of link to produce, leave unspecified or empty for default type.", "example": "plain", "type": "line", "suggestedvalues": [ "default", "plain" ], "default": "default" }, "text": { "label": "Link text", "description": "Custom text to show as the link text instead of the default \"Discord\".", "example": "BFF Discord", "type": "li..." wikitext text/x-wiki == TemplateData == <templatedata> { "params": { "1": { "label": "Type", "description": "Type of link to produce, leave unspecified or empty for default type.", "example": "plain", "type": "line", "suggestedvalues": [ "default", "plain" ], "default": "default" }, "text": { "label": "Link text", "description": "Custom text to show as the link text instead of the default \"Discord\".", "example": "BFF Discord", "type": "line", "default": "Discord" }, "icon": { "label": "Show icon", "description": "Whether to show a Discord icon next to the link.", "type": "boolean", "default": "no" } }, "description": "Produces a link to the official Bleak Faith: Forsaken Discord server.", "paramOrder": [ "1", "text", "icon" ], "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{DiscordLink}}</syntaxhighlight> &rarr; {{DiscordLink}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|icon=yes}}</syntaxhighlight> &rarr; {{DiscordLink|icon=yes}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|text=BFF Discord}}</syntaxhighlight> &rarr; {{DiscordLink|text=BFF Discord}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|plain}}</syntaxhighlight> &rarr; {{DiscordLink|plain}} <noinclude>[[Category:Template documentation]]</noinclude> 22afab3d89801781d6c6c24266696cd73a845e52 Bleak Faith: Forsaken Wiki/external 0 8 1352 387 2025-08-25T00:25:01Z Sharparam 284703 Use [[Template:DiscordLink]] template wikitext text/x-wiki {{Main page box/start | title = External links }} <div class="mp-links columns-2"> * {{MP link|Official site|link=http://www.bleakfaith.com/}} * {{MP link|Discord|link={{DiscordLink|plain}}|image=Discord.svg|size=64x64px}} * {{MP link|Reddit|link=https://www.reddit.com/r/Bleak_Faith/|image=Reddit.svg|size=64x64px}} * {{MP link|Steam|link=https://store.steampowered.com/app/1173220/Bleak_Faith_Forsaken/|image=Steam.svg|size=64x64px}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 8f030c58d461d7300f7d5d13f25a8a38a8a83694 Template:DiscordLink 10 856 1353 1351 2025-08-25T00:25:21Z Sharparam 284703 Protected "[[Template:DiscordLink]]": Used on main page ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki {{#vardefine:url|https://discord.com/invite/x7UCRbHAAq}}<!-- -->{{#vardefine:text|{{{text|Discord}}}}}<!-- -->{{#vardefine:icon|{{Yesno|{{{icon|}}}}}}}<!-- -->{{#switch:{{{1}}} | plain = {{#var:url}} | #default = {{#if:{{#var:icon}} | <span class="link-icon" style="--link-icon-size: 1.2em; --link-icon-line-height: 1lh;"><!-- --><span class="regular">[[File:Discord.svg|link={{#var:url}}|alt=]]</span><!-- -->&nbsp;<!-- --><span class="display-text">[{{#var:url}} {{#var:text}}]</span><!-- --></span> | [{{#var:url}} {{#var:text}}] }} }}<noinclude>{{Documentation}}</noinclude> c1e0c2547c9b5f013780e23c397049d7bdcc1170 Bleak Faith: Forsaken Wiki/about 0 6 1354 591 2025-08-25T00:29:50Z Sharparam 284703 Use an actual description of the game wikitext text/x-wiki {{Main page box/start | title = About [[Bleak Faith: Forsaken]] }} An action role-playing game taking place inside a perpetually expanding omnistructure. An unforgiving, interconnected world you will have to explore to uncover its secrets. <div style="text-align:right">[[Bleak Faith: Forsaken|Read more...]]</div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 08505fcc3499f10ca0632566339c2eb5415d5314 Bleak Faith: Forsaken Wiki/pages 0 5 1355 593 2025-08-25T00:33:06Z Sharparam 284703 Use more useful links wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Items|link=Items}} * {{MP link|Enemies|link=Enemies}} * {{MP link|NPCs|link=NPCs}} * {{MP link|Locations|link=Locations}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 328259a77b34d9cdc5f6ab08e48d3a850d82c4d5 Template:Infobox/Enemy 10 858 1356 2025-08-25T00:43:22Z Sharparam 284703 Created page with "<includeonly><!-- -->{{#invoke:Infobox|main | kind = enemy | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = File:Technomancy outlined...." wikitext text/x-wiki <includeonly><!-- -->{{#invoke:Infobox|main | kind = enemy | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance | SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}} | BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}} | TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}} }}{{Main other|[[Category:Enemies]]}}<!-- --></includeonly><noinclude>{{Documentation}}</noinclude> 1bd8491f251c3c6a83473071b7eacf3917f0e4de Template:Infobox/Enemy/doc 10 859 1357 2025-08-25T00:43:54Z Sharparam 284703 Created page with "<includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> d9c0501a4a136d46ea3e3e622e8875aba5810496 1362 1357 2025-08-25T08:21:23Z Sharparam 284703 Add an example wikitext text/x-wiki == Examples == {{Infobox/Enemy | title = Spooky Scary Skeleton | image = Skeleton.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Enemy | title = Spooky Scary Skeleton | image = Skeleton.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 35bb55d7b13bc4302d35488bfbaec23d8efc421c Fisherman 0 541 1358 843 2025-08-25T00:46:32Z Sharparam 284703 Sharparam renamed page [[Diver]] to [[Fisherman]]: Game files call the enemy "Fisherman" wikitext text/x-wiki The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location. == Drops == * [[Diver's Lungs Concoction]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Lesser Anomalous Crystal]] * [[Lesser Restorative Fluid]] * [[Ring of Burning Desire]] * [[Sludge]] * [[Upgrade Splinter]] [[Category:Enemies]] 854a2903c300d816cf3a65b85c7bee9c7c9aeb6e 1360 1358 2025-08-25T00:47:22Z Sharparam 284703 Add infobox and navbox wikitext text/x-wiki {{Infobox/Enemy | image = Fisherman.png }} The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location. == Drops == * [[Diver's Lungs Concoction]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Lesser Anomalous Crystal]] * [[Lesser Restorative Fluid]] * [[Ring of Burning Desire]] * [[Sludge]] * [[Upgrade Splinter]] {{Navbox/Enemies}} [[Category:Enemies]] 67a919be1ad3071e55951b7b9ca8a26908ed2b7b Diver 0 860 1359 2025-08-25T00:46:32Z Sharparam 284703 Sharparam renamed page [[Diver]] to [[Fisherman]]: Game files call the enemy "Fisherman" wikitext text/x-wiki #REDIRECT [[Fisherman]] 1642569f235baad045394007c41efb6519d7b76e Anomaly (location) 0 363 1361 489 2025-08-25T01:26:38Z Sharparam 284703 Add NPCs and bosses wikitext text/x-wiki [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] {{Navbox/Locations}} [[Category:Locations]] 8859acb4f72b39a0babab381a5fceb3b14b74005 Template:Infobox/Boss/doc 10 861 1363 2025-08-25T08:22:42Z Sharparam 284703 Created page with "== Examples == {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == Examples == {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Boss | title = Big Boss | image = Big Boss.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 6c59a5db79b0bb269e62a3ae86ee8d15b23aab40 Template:Infobox/Boss 10 461 1364 687 2025-08-25T08:23:32Z Sharparam 284703 Use [[Template:Main other]] and remove redundant category (specified in doc subpage) wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main | kind = boss | sep=, | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | title = {{{title|{{PAGENAME}}}}} | sections = Basic Info, Stats | Stats = HP, SharpResist, BluntResist, TechnomancyResist | SharpResist_label = [[File:Sharp outlined.png|20px|link=Sharp]] [[Sharp]] resistance | BluntResist_label = [[File:Blunt outlined.png|20px|link=Blunt]] [[Blunt]] resistance | TechnomancyResist_label = [[File:Technomancy outlined.png|20px|link=Technomancy]] [[Technomancy]] resistance | SharpResist = {{#if:{{{SharpResist|}}}|{{{SharpResist}}}%}} | BluntResist = {{#if:{{{BluntResist|}}}|{{{BluntResist}}}%}} | TechnomancyResist = {{#if:{{{TechnomancyResist|}}}|{{{TechnomancyResist}}}%}} }}{{Main other|[[Category:Bosses]]}}</includeonly><noinclude> {{Documentation}} </noinclude> 650d981203e72993b0187187d664318bb19f9d7a File:Site-background.jpg 6 862 1365 2025-08-25T16:29:08Z Sharparam 284703 From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/ wikitext text/x-wiki == Summary == From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/ == Licensing == {{License|game}} 391d84247204e37d49101e889156741a84adf2d1 1369 1365 2025-08-25T16:44:00Z Sharparam 284703 Protected "[[File:Site-background.jpg]]": Part of skin ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki == Summary == From the screenshots page of SteamDB: https://steamdb.info/app/1173220/screenshots/ == Licensing == {{License|game}} 391d84247204e37d49101e889156741a84adf2d1 MediaWiki:Common.css 8 235 1366 1331 2025-08-25T16:34:45Z Sharparam 284703 Set background for dark theme css text/css /* CSS placed here will be applied to all skins */ /****************************************************************************************** ********************************* Start user-edit variables ******************************* ******************************************************************************************/ /***************************************** ****** START BASIC DESIGN VARIABLES ****** ----------------------------------------*/ :root { --wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif; --wiki-sidebar-heading-font-family: sans-serif; --wiki-content-border-radius: 0px; --wiki-sidebar-border-radius: 0px; } /*---------------------------------------- ******* END BASIC DESIGN VARIABLES ******* *****************************************/ /***************************************** ****** START BASIC COLOR VARIABLES ******* ----------------------------------------*/ :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-content-background-color: #ffffff; --wiki-content-background-opacity: 100%; --wiki-content-border-color: #a7d7f9; --wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ LIGHT VIEW ] */ --wiki-accent-color: #3366cc; --wiki-accent-label-color: #ffffff; --wiki-accent-link-color: #D5FB51; --wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ } /* end light styles */ /* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=dark, */ /* individual themes are prefixed with .theme- instead */ .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); --wiki-content-background-color: #202020; --wiki-content-background-opacity: 90%; /* DEFAULT: --wiki-content-border-color: #991A51; */ --wiki-content-border-color: hsl(0deg 0% 30%); --wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ DARK VIEW ] */ /* DEFAULT: --wiki-accent-color: #ff4d9d; */ --wiki-accent-color: hsl(0deg 0% 75%); --wiki-accent-label-color: #000; --wiki-accent-link-color: #1e1e43; --wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ /* Site background */ --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-body-background-position: center; --wiki-body-background-size: cover; --wiki-body-background-attachment: fixed; } /* End dark styles */ /*---------------------------------------- ******* END BASIC COLOR VARIABLES ******** *****************************************/ /***************************************** **** START ADVANCED COLOR VARIABLES ****** ----------------------------------------*/ :root, .view-light { /******************* * Maybe edit these * [ LIGHT VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #111111; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #ba0000; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ LIGHT VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ LIGHT VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #bf0017; --wiki-warning-color: #b05f30; --wiki-success-color: #0c742f; /**/ /*********************************** * Likely do not need to edit these * [ LIGHT VIEW ] ************************************/ --wiki-body-dynamic-color: #000000; --wiki-body-dynamic-color--inverted: #ffffff; --wiki-body-dynamic-color--secondary: #333333; --wiki-body-dynamic-color--secondary--inverted: #cccccc; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #ffffff; --wiki-content-dynamic-color: #000000; --wiki-content-dynamic-color--inverted: #ffffff; --wiki-content-dynamic-color--secondary: #333333; --wiki-content-dynamic-color--secondary--inverted: #cccccc; /* [ LIGHT VIEW ] */ --wiki-alert-label-color: #ffffff; --wiki-warning-label-color: #ffffff; --wiki-success-label-color: #ffffff; --wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */ /**/ } .view-dark { /******************* * Maybe edit these * [ DARK VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #ededed; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #FC5B4F; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ DARK VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ DARK VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #ff576a; --wiki-warning-color: #cf721c; --wiki-success-color: #13aa45; /**/ /*********************************** * Likely do not need to edit these * [ DARK VIEW ] ************************************/ --wiki-body-dynamic-color: #ffffff; --wiki-body-dynamic-color--inverted: #000000; --wiki-body-dynamic-color--secondary: #cccccc; --wiki-body-dynamic-color--secondary--inverted: #333333; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #000; --wiki-content-dynamic-color: #ffffff; --wiki-content-dynamic-color--inverted: #000000; --wiki-content-dynamic-color--secondary: #cccccc; --wiki-content-dynamic-color--secondary--inverted: #333333; /* [ DARK VIEW ] */ --wiki-alert-label-color: #000000; --wiki-warning-label-color: #000000; --wiki-success-label-color: #000000; --wiki-icon-general-filter: invert(100%); } /*---------------------------------------- ***** END ADVANCED COLOR VARIABLES ******* *****************************************/ /***************************************** **** START ADVANCED DESIGN VARIABLES ***** ----------------------------------------*/ :root { /*********************** start logo position ----------------------*/ --wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */ --wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */ --wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */ --wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */ --wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */ /*----------------------- end logo position ***********************/ --wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */ --wiki-body-font-family: sans-serif; --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */ /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-width: 1px; --wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */ --wiki-sidebar-portal-spacing: 0px; --wiki-sidebar-border-width: var(--wiki-content-border-width); --wiki-navigation-border-radius: 0px; /* border radius of tabs */ /******************* * Maybe edit these * [ DESIGN ] ********************/ --wiki-logo-filter: none; /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-top-radius: var(--wiki-content-border-radius); --wiki-content-border-style: solid; --wiki-content-border-image: none; --wiki-content-backdrop-filter: none; --wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */ --wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */ --wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-line-height: 1.125; --wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-margin: 0.5em; --wiki-sidebar-list-item-padding: 0.25em 0.25rem; --wiki-sidebar-list-padding: 0.25rem; --wiki-sidebar-list-item-background--hover: none; /* background of hover item */ --wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */ --wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */ --wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-box-background-color: var(--wiki-content-background-color); --wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content)); --wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ --wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ /* nav tabs style. The vector gradient is default. * If you want to customize the style of tabs, it's easier to start with the following settings: * --wiki-navigation-background-image: none; * --wiki-navigation-selected-background-image: none; * --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px ); * --wiki-navigation-selected-border-bottom-background: none; * --wiki-navigation-tab-spacing: 0.25em; * --wiki-navigation-tab-padding-top: 0.5em; * --wiki-navigation-tab-padding-bottom: 0.5em; */ --wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */ --wiki-navigation-tab-padding-top: 1.25em; --wiki-navigation-tab-padding-x: 0.75em; --wiki-navigation-tab-padding-bottom: 4px; --wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */ --wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */ --wiki-navigation-border-image: none; --wiki-navigation-selected-border-image: var(--wiki-navigation-border-image); --wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%); --wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x; --wiki-navigation-background-position: left bottom, right bottom, left bottom; --wiki-navigation-background-size: 1px 100%, 1px 100%, 100%; --wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%); --wiki-navigation-selected-background-repeat: no-repeat, no-repeat; --wiki-navigation-selected-background-position: left bottom, right bottom; --wiki-navigation-selected-background-size: 1px 100%, 1px 100%; --wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px); /* affects the dropdown menu under More */ --wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color); --wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color); --wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */ --wiki-navigation-dropdown-border-width: 1px; --wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius); --wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */ --wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */ --wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */ --wiki-navigation-dropdown-border-image: none; --wiki-navigation-dropdown-backdrop-filter: none; --wiki-navigation-dropdown-box-shadow: none; /* box shadow */ /* styles of the footer */ --wiki-spacing-before-footer: 0px; --wiki-footer-border-image: none; /* padding on body element */ --wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */ --wiki-left-spacing: 0.5em; --wiki-right-spacing: 1em; --wiki-bottom-spacing: 2em; /* end design variables */ } /*---------------------------------------- ***** END ADVANCED DESIGN VARIABLES ****** *****************************************/ /******************************* **** START SHARED VARIABLES **** **** tl;dr: don't edit this **** ********************************/ /* These variables are rarely touched, usually inherit other variables, and are shared on all themes. In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision, understand what you are doing, and *know* that what you are trying to do is not accomplished by changing another variable in the above sections. Since these are by default shared across all themes, if you support multiple themes you'll probably want to separate the variables you want to modify here into .view-x blocks like above. If you don't understand what that means or how to do that then you probably shouldn't be modifying this section. */ :root { --wiki-content-border-bottom-width: var(--wiki-content-border-width); --wiki-content-border-bottom-style: var(--wiki-content-border-style); --wiki-content-border-bottom-color: var(--wiki-content-border-color); --wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%); --wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color)); --wiki-content-text-color--hover: var(--wiki-content-text-color); /* heading */ --wiki-content-heading-border-bottom-width: 1px; --wiki-content-heading-border-style: solid; --wiki-content-heading-font-weight: normal; --wiki-content-heading-font-style: normal; --wiki-content-heading-text-transform: none; --wiki-content-heading-line-height: normal; --wiki-content-heading-text-shadow: none; /* first heading (h1) */ --wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width); --wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); --wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight); --wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style); --wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform); --wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-firstheading-color: var(--wiki-content-heading-color); --wiki-content-firstheading-text-shadow: none; /* sub-heading (h3, h4, h5, h6) */ --wiki-content-subheading-border-bottom-width: 0px; --wiki-content-subheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-subheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-subheading-font-family: var(--wiki-body-font-family); --wiki-content-subheading-font-weight: bold; --wiki-content-subheading-font-style: normal; --wiki-content-subheading-text-transform: none; --wiki-content-subheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-subheading-color: var(--wiki-content-heading-color); --wiki-content-subheading-text-shadow: none; /* heading size */ --wiki-content-firstheading-font-size: 1.8em; --wiki-content-heading-h2-font-size: 1.5em; --wiki-content-heading-h3-font-size: 1.2em; --wiki-content-heading-h4-font-size: 114%; --wiki-content-heading-h5-font-size: 108%; --wiki-content-heading-h6-font-size: 100%; --wiki-content-toc-background: var(--wiki-content-background-color--secondary); --wiki-content-toc-border-width: 1px; --wiki-content-toc-border-style: solid; --wiki-content-toc-border-color: var(--wiki-content-border-color); --wiki-content-toc-border-radius: 0px; --wiki-content-toc-border-image: none; --wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000; --wiki-content-catlinks-background: var(--wiki-content-background-color--secondary); --wiki-content-catlinks-border-width: 1px; --wiki-content-catlinks-border-style: solid; --wiki-content-catlinks-border-color: var(--wiki-content-border-color); --wiki-content-catlinks-border-radius: 0px; --wiki-content-catlinks-border-image: none; --wiki-content-catlinks-box-shadow: none; --wiki-content-filetoc-background: var(--wiki-content-background-color--secondary); --wiki-content-filetoc-border-width: 1px; --wiki-content-filetoc-border-style: solid; --wiki-content-filetoc-border-color: var(--wiki-content-border-color); --wiki-content-filetoc-border-radius: 0px; --wiki-content-filetoc-border-image: none; --wiki-content-filetoc-box-shadow: none; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; --wiki-sidebar-padding: 0px; --wiki-sidebar-background-color: var(--wiki-content-background-color); --wiki-sidebar-background-opacity: var(--wiki-content-background-opacity); --wiki-sidebar-background-image: none; --wiki-sidebar-background-position: center; --wiki-sidebar-background-repeat: repeat; --wiki-sidebar-background-size: auto; --wiki-sidebar-filter: none; --wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-sidebar-border-color: var(--wiki-content-border-color); --wiki-sidebar-border-style: solid; --wiki-sidebar-border-image: none; --wiki-sidebar-link-color: var(--wiki-content-link-color); --wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover); --wiki-sidebar-heading-color: var(--wiki-content-heading-color); --wiki-sidebar-heading-font-weight: normal; --wiki-sidebar-heading-font-style: normal; --wiki-sidebar-heading-text-transform: none; --wiki-sidebar-heading-line-height: normal; --wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem; --wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-text-shadow: none; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter); --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-box-padding: 0px; --wiki-sidebar-box-background: none; --wiki-sidebar-box-border: 0px; --wiki-sidebar-box-border-image: none; --wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color)); --wiki-footer-border-width: var(--wiki-content-border-width); --wiki-footer-border-style: var(--wiki-content-border-style); --wiki-footer-border-color: var(--wiki-content-border-color); --wiki-footer-background-color: var(--wiki-content-background-color); --wiki-footer-background-opacity: var(--wiki-content-background-opacity); --wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-footer-text-color: var(--wiki-content-text-color); --wiki-footer-link-color: var(--wiki-content-link-color); --wiki-footer-link-color--hover: var(--wiki-content-link-color--hover); --wiki-footer-border-radius: var(--wiki-content-border-radius); --wiki-navigation-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-background-color--hover: var(--wiki-navigation-background-color); --wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity); --wiki-navigation-background-image--hover: var(--wiki-navigation-background-image); --wiki-navigation-background-position--hover: var(--wiki-navigation-background-position); --wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat); --wiki-navigation-background-size--hover: var(--wiki-navigation-background-size); --wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover); --wiki-navigation-transform--hover: none; --wiki-navigation-selected-border-style: solid; --wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-border-style: solid; --wiki-navigation-border-color--hover: var(--wiki-navigation-border-color); --wiki-navigation-border-image--hover: var(--wiki-navigation-border-image); --wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style); --wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)); --wiki-navigation-icon-size: 1em; --wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x); --wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */ --wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color); --wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color); --wiki-navigation-dropdown-offset: 0px; /* vertical offset */ --wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-search-background-image: none; --wiki-navigation-search-background-position: 0; --wiki-navigation-search-background-size: auto; --wiki-navigation-search-background-repeat: repeat; --wiki-navigation-search-backdrop-filter: none; --wiki-navigation-search-border-color: var(--wiki-navigation-border-color); --wiki-navigation-search-border-color--hover: var(--wiki-accent-color); --wiki-navigation-search-border-style: solid; --wiki-navigation-search-border-width: 1px; --wiki-navigation-search-border-radius: 2px; --wiki-navigation-search-border-image: none; --wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image); --wiki-navigation-search-box-shadow: none; --wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow); --wiki-navigation-search-text-color: var(--wiki-content-text-color); --wiki-navigation-search-font-size: var(--wiki-navigation-font-size); --wiki-navigation-search-height: 2em; --wiki-navigation-search-button-color: currentColor; --wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color); --wiki-navigation-search-button-color-opacity: 80%; --wiki-navigation-search-button-color-opacity--hover: 95%; --wiki-navigation-search-bottom-spacing: 3px; --wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); --wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */ } /*** mobile adjustments ***/ @media screen and (max-width: 720px) { body.has-vector-mobile-menu{ --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-margin: 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-margin: 0px 0px -0.5em 0px; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-line-height: 1.125; --wiki-sidebar-background-opacity: 100%; --wiki-navigation-search-border-width: 1px; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; } } /***************************** **** END SHARED VARIABLES **** ******************************/ /****************************************************************************************** ********************************* End user-edit variables ********************************* ******************************************************************************************/ /****************************** * Fallback for older browsers * * DONT EDIT THIS * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .view-dark, .view-light, :root { --wiki-content-text-mix-color: var(--wiki-content-text-color); --wiki-content-text-mix-color-95: var(--wiki-content-background-color); --wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted); --wiki-content-border-color--secondary: var(--wiki-content-border-color); --wiki-content-border-color--accent: var(--wiki-accent-color); --wiki-accent-color--hover: var(--wiki-accent-color); --wiki-navigation-search-highlight-background-color: transparent; } } /***************************** * End older browser fallback * ******************************/ /***************************** * PortableInfoboxes * ******************************/ :root { --pi-background: var(--wiki-content-background-color); --pi-secondary-background: var(--wiki-accent-color); --pi-secondary-background-label: var(--wiki-accent-label-color); --pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent); } .portable-infobox .pi-title, .portable-infobox .pi-header { text-align: center; font-size: 1.5em; background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent); color: var(--pi-secondary-background-label); } .portable-infobox .pi-data, .portable-infobox .pi-group { background: var(--wiki-content-background-color--secondary); } .portable-infobox .pi-image { padding: 8px; } .pi-image-thumbnail { max-width: 100%; } .pi-caption { color: var(--wiki-content-text-mix-color); } .pi-section-navigation .pi-section-tab.pi-section-active, .pi-section-navigation .pi-section-tab.current, .pi-media-collection .pi-tab-link.current { background: var(--pi-secondary-background); color: var(--pi-secondary-background-label); } .pi-collapse > .pi-item:first-child { cursor: pointer; } /* overqualify these to overwrite normal content heading styles */ .mw-body .portable-infobox h2, .mw-body .portable-infobox h3 { border-bottom: 0; font-family: inherit; font-weight: 700; margin: 0; } /***************************** * End PortableInfoboxes * ******************************/ /******************* * Main page layout * ********************/ #mp-container { display: grid; gap: 10px; } @media screen and (max-width: 990px) { /* for mobile screens */ #mp-container { grid-template-areas:var(--main-page-layout--mobile); grid-template-columns:var(--main-page-layout-columns--mobile, 100%); } .mp-box.mp-hide-on-mobile { display: none; } } @media screen and (min-width: 990px) and (max-width: 1350px) { /* for narrow screens, between 990px and 1350px */ #mp-container { grid-template-areas:var(--main-page-layout--tablet); grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr); } .mp-box.mp-hide-on-tablet { display: none; } } @media screen and (min-width: 1350px) { /* for all other screens, 1350px and wider */ #mp-container { grid-template-areas:var(--main-page-layout--desktop); grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr); } .mp-box.mp-hide-on-desktop { display: none; } } .mp-box { position: relative; display: flex; flex-flow: column nowrap; width: 100%; box-sizing: border-box; background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent); border: 1px solid var(--wiki-content-border-color); padding: 0px; } .mp-body { height: 100%; display: flex; padding: 0.5em; flex-flow: column nowrap; } .mp-box.centered-content .mp-body { height: 100%; display: flex; flex-flow: column nowrap; justify-content: space-evenly; } .mp-box.has-floating-image { display: block; } .mp-box.has-floating-image .mp-body { height: unset; display: block; } /* overqualified to override normal heading styles */ .mw-body .mp-box h2 { text-align: center; font-weight: bold; font-family: var(--wiki-content-heading-font-family); overflow: initial; border-bottom: 1px solid var(--wiki-content-border-color); font-size: 150%; margin: 0; padding: 5px 0; color: var(--wiki-content-heading-color); } #mp-box-welcome { text-align: center; position: relative; overflow: hidden; } #mp-box-welcome h2 { font-size: 200%; } #mp-welcome { display: flex; flex-flow: column nowrap; position: relative; height: 100%; z-index: 2; box-sizing: border-box; } #mp-welcome .welcome-subtitle { height: 100%; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); padding: 0.5em; } #mp-banner { position: absolute; width: 100%; height: 100%; filter: blur(5px); z-index: -1; background: url(/images/e/e0/MP_banner.jpg); background-size: cover; background-repeat: no-repeat; background-position: top center; } .view-dark #mp-banner { filter: blur(5px) brightness(50%); } .view-light #mp-banner { filter: blur(5px) contrast(50%); } /* [[Template:MP_link]] */ .mp-links { --gap: 10px; } .mp-links > ul { display: flex; flex-flow: row wrap; justify-content: space-evenly; margin: 2px; gap: var(--gap); } .mp-links > ul > li { display: flex; flex-flow: column nowrap; align-items: stretch; text-align: center; box-sizing: border-box; flex: max(calc(50% - var(--gap)), 5em) 1 1; outline: 1px solid var(--wiki-content-link-color); transition: 0.1s ease-in; } .mp-links > ul > li:hover { background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); } .mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;} .mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;} .mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;} .mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;} .mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;} .mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;} .mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;} .mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;} .mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;} .mp-links > ul > li:hover a { text-decoration: underline; } .mp-links > ul > li > a { display: flex; align-items: center; justify-content: center; height: 100%; flex: 1 1 auto; box-sizing: border-box; padding: 5px; } .mp-links > ul > li > a:first-child { height: 100%; } .mp-links > ul > li > a:last-child:not(:first-child) { height: unset; } .mp-links.stretch, .mp-links.stretch > ul { height: 100%; } .mp-links.side-image li { flex-flow: row nowrap; } .mp-links.plain > ul > li { outline-color: transparent; } /*********************** * End main page layout * ************************/ /********************************************************************************************************************* * Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) * **********************************************************************************************************************/ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: */ .hlist dt:not(:last-child)::after { content: ":\20"; } .hlist dd:not(:last-child)::after, .hlist li:not(:last-child)::after { /* "space, Middle Dot, space" We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters. The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */ /* content: "\20\00B7\20"; font-weight: bold; */ /* "space &nbsp; • &nbsp; space" There may (and likely) be an extra whitespace between <li>s, therefore we have to use a space character as last character of this sequence. By this way, the last space and the next whitespce will collapse as a single space, to make the whitespace on both sides of the middle dot the same width. */ content: "\20\A0\2022\A0\20"; font-weight: inherit; } /* Add parentheses around nested lists */ .hlist dd ol::before, .hlist dd ul::before, .hlist dd dl::before, .hlist dt ol::before, .hlist dt ul::before, .hlist dt dl::before, .hlist li ol::before, .hlist li ul::before, .hlist li dl::before { content: "\20("; font-weight: inherit; } .hlist dd ol::after, .hlist dd ul::after, .hlist dd dl::after, .hlist dt ol::after, .hlist dt ul::after, .hlist dt dl::after, .hlist li ol::after, .hlist li ul::after, .hlist li dl::after { content: ")"; font-weight: inherit; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) ".\20"; } /* Progressive enhancement: * try to make the dot always follow the list item in same line */ .hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) { display: inline-block; } /******************************************** * End semantically-correct horizontal lists * *********************************************/ /*** Miscellaneous ***/ .responsive-image { max-width: 100%; height: auto; } .view-dark .invert-on-dark, .view-light .invert-on-light { filter: invert(100%); } .pixelated { image-rendering: pixelated; } @media screen and (min-width: 720px) { .mobileonly { display: none; } } @media screen and (max-width: 720px) { .nomobile { display: none; } } /*** Utility classes for standard MW galleries ***/ /* it's important that spaced comes before centered in the sheet */ .gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */ display: flex; flex-flow: row wrap; justify-content: space-evenly; margin-left: unset; } .gallery.centered { text-align: center; } /************************** * Start Modular Templates * **************************/ /********* [[Template:Ambox]] *********/ .ambox { --ambox-color: var(--wiki-accent-color); border: 1px solid var(--wiki-content-border-color); border-left: 10px solid var(--ambox-color); border-radius: 2px; display: flex; align-items: center; gap: .6em; margin: 1em 0; padding: 3px .6em; background-color: var(--wiki-content-background-color--secondary); box-shadow: 2px 2px 5px 0px #0002; } @media (min-width: 720px) { .ambox { margin-inline: 10%; } } .ambox.tiny { padding: .04rem .5em; margin-inline: 0; width: fit-content; } .ambox + .ambox { margin-top: -.6em; } .ambox-content { flex: 1; } .ambox-content p { margin: .15em 0; } .ambox-title { font-weight: bold; } /********* [[Template:Hatnote]] *********/ .hatnote { padding: 1px 0 1px 1.6em; margin-bottom: 0.5em; font-style: italic; border-top: 1px solid var(--wiki-content-border-color--secondary); border-bottom: 1px solid var(--wiki-content-border-color--secondary); } .hatnote.icon { padding-left: 0; } /********* [[Template:Spoiler]] *********/ .spoiler-content { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent); transition: all 0.3s; cursor: pointer; overflow: auto; } @supports not (color:color-mix(in srgb, #000, transparent)) { .spoiler-content { background-color: var(--wiki-content-dynamic-color--secondary); } } .spoiler-content > * { pointer-events: none; opacity: 0; transition: all 0.3s; } .spoiler-content.show { background-color: transparent; } .spoiler-content.show > * { pointer-events: unset; opacity: 1; } /********* [[Template:Link icon]] *********/ .link-icon { --link-icon-line-height: 1.5em; --link-icon-size: 1.5em; display: inline-flex; align-items: center; height: var(--link-icon-line-height); vertical-align: bottom; } .link-icon .regular { align-self: center; } .link-icon .regular a { display: flex; } .link-icon .regular img { height: var(--link-icon-size); max-width: var(--link-icon-size); } .link-icon .fallback { outline: 1px solid var(--wiki-content-text-color); border-radius: 50%; text-align: center; width: var(--link-icon-size); line-height: var(--link-icon-size); } .link-icon.notext, .link-icon.notext .fallback { display: inline-block; } /********* [[Template:Quote]] *********/ .quote { background: var(--wiki-content-background-color--secondary); border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: .5em 0; padding: .5em; overflow-y: hidden; } .quote .block { display: block; } .quote .title { font-size: large; font-weight: bold; } .quote .content { font-style: italic; } .quote .author { font-weight: bold; text-align: end; } .quote .marks-wrapper { display: flex; gap: 5px; } .quote .marks-wrapper::before, .quote .marks-wrapper::after { font-size: 100px; line-height: 0px; } .quote .marks-wrapper::before { content: "\201C"; margin-top: 40px; } .quote .marks-wrapper::after { content: "\201D"; align-self: end; margin-bottom: -10px; } .client-js .mw-charinsert-item { display: none; } /************************ * End Modular Templates * *************************/ /***************************** * Used by [[Template:Color]] * ******************************/ .color__splotch { display: inline-block; height: 1em; width: 1em; box-sizing: border-box; vertical-align: text-top; border-radius: 50%; border: 1px solid var(--wiki-content-text-color); } /********************* * End Template:Color * **********************/ /********************************* * Used by [[Template:TOC limit]] * **********************************/ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /************************* * End Template:TOC limit * **************************/ /********************************* * Used by [[Template:TOC right]] * **********************************/ @media all and (min-width: 720px) { .tocright { float: right; clear: right; margin: 0 0 0.5em 1em; } } /************************* * End Template:TOC right * **************************/ 811b0c2d2cf7be45e70eb3d56d102f46be473d27 1368 1366 2025-08-25T16:37:46Z Sharparam 284703 Add background image for light theme css text/css /* CSS placed here will be applied to all skins */ /****************************************************************************************** ********************************* Start user-edit variables ******************************* ******************************************************************************************/ /***************************************** ****** START BASIC DESIGN VARIABLES ****** ----------------------------------------*/ :root { --wiki-content-heading-font-family: 'Linux Libertine', 'Georgia', 'Times', serif; --wiki-sidebar-heading-font-family: sans-serif; --wiki-content-border-radius: 0px; --wiki-sidebar-border-radius: 0px; } /*---------------------------------------- ******* END BASIC DESIGN VARIABLES ******* *****************************************/ /***************************************** ****** START BASIC COLOR VARIABLES ******* ----------------------------------------*/ :root, /* Begin light styles, delete from here to "end light styles" if you don't want your wiki to support any light themes (remove from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=light, */ /* individual themes are prefixed with .theme- instead */ .view-light { /********************** * Probably edit these * [ LIGHT VIEW ] ***********************/ --wiki-body-background-color: #F6F6F6; --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-content-background-color: #ffffff; --wiki-content-background-opacity: 100%; --wiki-content-border-color: #a7d7f9; --wiki-content-link-color: #0645ad; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ LIGHT VIEW ] */ --wiki-accent-color: #3366cc; --wiki-accent-label-color: #ffffff; --wiki-accent-link-color: #D5FB51; --wiki-icon-to-link-filter: invert(20%) sepia(93%) saturate(2141%) hue-rotate(210deg) brightness(83%) contrast(103%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ /* Site background */ --wiki-body-background-image: url(filepath://Site-background-light.jpg); --wiki-body-background-position: center; --wiki-body-background-size: cover; --wiki-body-background-attachment: fixed; } /* end light styles */ /* Begin dark styles, delete from here to "end dark styles" if you don't want your wiki to support any dark themes (remove it from [[Mediawiki:Theme-definitions]] too, or ask wiki.gg staff for help doing this) */ /* FYI: .view- will affect any theme marked |kind=dark, */ /* individual themes are prefixed with .theme- instead */ .view-dark { /********************** * Probably edit these * [ DARK VIEW ] ***********************/ --wiki-body-background-color: #171717; --wiki-body-background-image: url(filepath://Site-background-dark.jpg); --wiki-content-background-color: #202020; --wiki-content-background-opacity: 90%; /* DEFAULT: --wiki-content-border-color: #991A51; */ --wiki-content-border-color: hsl(0deg 0% 30%); --wiki-content-link-color: #6d8afb; /* if changing this, remember to change --wiki-icon-to-link-filter as well!!! */ /* [ DARK VIEW ] */ /* DEFAULT: --wiki-accent-color: #ff4d9d; */ --wiki-accent-color: hsl(0deg 0% 75%); --wiki-accent-label-color: #000; --wiki-accent-link-color: #1e1e43; --wiki-icon-to-link-filter: invert(60%) sepia(70%) saturate(3715%) hue-rotate(206deg) brightness(101%) contrast(97%); /* put your --wiki-content-link-color into https://mrpie5.gitlab.io/css-filter-generator/ */ /**/ /* Site background */ --wiki-body-background-image: url(filepath://Site-background.jpg); --wiki-body-background-position: center; --wiki-body-background-size: cover; --wiki-body-background-attachment: fixed; } /* End dark styles */ /*---------------------------------------- ******* END BASIC COLOR VARIABLES ******** *****************************************/ /***************************************** **** START ADVANCED COLOR VARIABLES ****** ----------------------------------------*/ :root, .view-light { /******************* * Maybe edit these * [ LIGHT VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #111111; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #ba0000; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ LIGHT VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ LIGHT VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #bf0017; --wiki-warning-color: #b05f30; --wiki-success-color: #0c742f; /**/ /*********************************** * Likely do not need to edit these * [ LIGHT VIEW ] ************************************/ --wiki-body-dynamic-color: #000000; --wiki-body-dynamic-color--inverted: #ffffff; --wiki-body-dynamic-color--secondary: #333333; --wiki-body-dynamic-color--secondary--inverted: #cccccc; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #ffffff; --wiki-content-dynamic-color: #000000; --wiki-content-dynamic-color--inverted: #ffffff; --wiki-content-dynamic-color--secondary: #333333; --wiki-content-dynamic-color--secondary--inverted: #cccccc; /* [ LIGHT VIEW ] */ --wiki-alert-label-color: #ffffff; --wiki-warning-label-color: #ffffff; --wiki-success-label-color: #ffffff; --wiki-icon-general-filter: ; /* do not set this to none, ignore the "unexpected token" error */ /**/ } .view-dark { /******************* * Maybe edit these * [ DARK VIEW ] ********************/ --wiki-body-background-position: top center; --wiki-body-background-size: cover; --wiki-body-background-repeat: no-repeat; --wiki-body-background-attachment: fixed; --wiki-content-background-color--secondary: color-mix(in srgb, var(--wiki-content-background-color) 96%, var(--wiki-content-dynamic-color)); --wiki-content-text-color: #ededed; --wiki-content-link-color--visited: var(--wiki-content-link-color); --wiki-content-link-color--hover: var(--wiki-content-link-color); --wiki-content-redlink-color: #FC5B4F; --wiki-content-heading-color: var(--wiki-content-text-color); --wiki-content-heading-border-color: var(--wiki-content-border-color); /* [ DARK VIEW ] */ --wiki-navigation-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-border-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-text-color: var(--wiki-content-link-color); --wiki-navigation-selected-background-color: var(--wiki-content-background-color); --wiki-navigation-selected-border-color: var(--wiki-content-border-color); --wiki-navigation-selected-text-color: var(--wiki-content-text-color); /* [ DARK VIEW ] */ --wiki-neutral-color: var(--wiki-content-text-mix-color); --wiki-alert-color: #ff576a; --wiki-warning-color: #cf721c; --wiki-success-color: #13aa45; /**/ /*********************************** * Likely do not need to edit these * [ DARK VIEW ] ************************************/ --wiki-body-dynamic-color: #ffffff; --wiki-body-dynamic-color--inverted: #000000; --wiki-body-dynamic-color--secondary: #cccccc; --wiki-body-dynamic-color--secondary--inverted: #333333; --wiki-content-border-color--secondary: color-mix(in srgb, var(--wiki-content-border-color) 50%, transparent); --wiki-content-border-color--accent: color-mix(in srgb, var(--wiki-accent-color) 50%, transparent); --wiki-content-link-label-color: #000; --wiki-content-dynamic-color: #ffffff; --wiki-content-dynamic-color--inverted: #000000; --wiki-content-dynamic-color--secondary: #cccccc; --wiki-content-dynamic-color--secondary--inverted: #333333; /* [ DARK VIEW ] */ --wiki-alert-label-color: #000000; --wiki-warning-label-color: #000000; --wiki-success-label-color: #000000; --wiki-icon-general-filter: invert(100%); } /*---------------------------------------- ***** END ADVANCED COLOR VARIABLES ******* *****************************************/ /***************************************** **** START ADVANCED DESIGN VARIABLES ***** ----------------------------------------*/ :root { /*********************** start logo position ----------------------*/ --wiki-is-top-logo: 0; /* 1 = center logo at the top of the page; 0 = logo at the top left of the page */ --wiki-logo-file-width: 160; /* Width of the image file in px. Put a number without the letters `px`. */ --wiki-logo-file-height: 160; /* Height of the image file in px. Put a number without the letters `px`. */ --wiki-logo-height: calc(var(--wiki-logo-file-height)*1px); /* Valid only when --wiki-is-top-logo is 1. The height the logo should be shown */ --wiki-logo-margin: 15px; /* the width of margin below the logo. When --wiki-is-top-logo is 1, this is also the default value of --wiki-top-spacing */ /*----------------------- end logo position ***********************/ --wiki-is-navigation-inside-content: 0; /* 0 = default navigation tabs layout; 1 = navigation tabs inside content box */ --wiki-body-font-family: sans-serif; --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); /* only apply to the main title of article */ /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-width: 1px; --wiki-sidebar-width: 10em; /* width of sidebar(#mw-panel) */ --wiki-sidebar-portal-spacing: 0px; --wiki-sidebar-border-width: var(--wiki-content-border-width); --wiki-navigation-border-radius: 0px; /* border radius of tabs */ /******************* * Maybe edit these * [ DESIGN ] ********************/ --wiki-logo-filter: none; /****** the following length variables must have units specified even if 0, ignore the warning *****/ --wiki-content-border-top-radius: var(--wiki-content-border-radius); --wiki-content-border-style: solid; --wiki-content-border-image: none; --wiki-content-backdrop-filter: none; --wiki-page-content-max-width: 9999px; /* max width of sidebar+gap+content, must be a length value. A huge value can be used to indicate no limit, e.g. 99999px */ --wiki-gap-between-sidebar-and-content: 0.5em; /* gap between sidebar(#mw-panel) and content(#content) */ --wiki-sidebar-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-line-height: 1.125; --wiki-sidebar-heading-font-size: 0.75em; /* please use em or rem for this */ --wiki-sidebar-margin: 0.5em; --wiki-sidebar-list-item-padding: 0.25em 0.25rem; --wiki-sidebar-list-padding: 0.25rem; --wiki-sidebar-list-item-background--hover: none; /* background of hover item */ --wiki-navigation-font-size: 0.8125em; /* please use em or rem for this */ --wiki-navigation-height: 2.75rem; /* height of navigation area,include spacing above tabs */ --wiki-navigation-left-spacing: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-radius) + var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-right-spacing: calc( var(--wiki-is-navigation-inside-content) * 0.5rem ); --wiki-navigation-box-background-color: var(--wiki-content-background-color); --wiki-navigation-box-background-opacity: calc(var(--wiki-content-background-opacity)*0.8*var(--wiki-is-navigation-inside-content)); --wiki-navigation-box-background: color-mix(in srgb, var(--wiki-navigation-box-background-color) var(--wiki-navigation-box-background-opacity), transparent); /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-border-image: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-box-backdrop-filter: none; /* usually only needed when --wiki-is-navigation-inside-content is 1 */ --wiki-navigation-selected-backdrop-filter: var(--wiki-content-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ --wiki-navigation-backdrop-filter: var(--wiki-navigation-selected-backdrop-filter); /* usually only needed when --wiki-is-navigation-inside-content is 0 */ /* nav tabs style. The vector gradient is default. * If you want to customize the style of tabs, it's easier to start with the following settings: * --wiki-navigation-background-image: none; * --wiki-navigation-selected-background-image: none; * --wiki-navigation-selected-border-width: calc( (1 - var(--wiki-is-navigation-inside-content))*var(--wiki-content-border-width) + var(--wiki-is-navigation-inside-content) * 1px ); * --wiki-navigation-selected-border-bottom-background: none; * --wiki-navigation-tab-spacing: 0.25em; * --wiki-navigation-tab-padding-top: 0.5em; * --wiki-navigation-tab-padding-bottom: 0.5em; */ --wiki-navigation-tab-spacing: -1px; /* width of the space between tabs, can be a negative number, in which case adjacent tabs will overlap */ --wiki-navigation-tab-padding-top: 1.25em; --wiki-navigation-tab-padding-x: 0.75em; --wiki-navigation-tab-padding-bottom: 4px; --wiki-navigation-selected-border-width: 0px; /* border width of selected tabs */ --wiki-navigation-border-width: var(--wiki-navigation-selected-border-width); /* border width of normal tabs */ --wiki-navigation-border-image: none; --wiki-navigation-selected-border-image: var(--wiki-navigation-border-image); --wiki-navigation-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to top,var(--wiki-navigation-background-color) 0,var(--wiki-navigation-selected-background-color) 100%); --wiki-navigation-background-repeat: no-repeat, no-repeat, repeat-x; --wiki-navigation-background-position: left bottom, right bottom, left bottom; --wiki-navigation-background-size: 1px 100%, 1px 100%, 100%; --wiki-navigation-selected-background-image: linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%), linear-gradient(to bottom,transparent 0,var(--wiki-content-border-color) 100%); --wiki-navigation-selected-background-repeat: no-repeat, no-repeat; --wiki-navigation-selected-background-position: left bottom, right bottom; --wiki-navigation-selected-background-size: 1px 100%, 1px 100%; --wiki-navigation-selected-border-bottom-background: linear-gradient(to right, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px), linear-gradient(to left, var(--wiki-content-border-color) 0, var(--wiki-content-border-color) 1px, transparent 1px); /* affects the dropdown menu under More */ --wiki-navigation-dropdown-text-color: var(--wiki-navigation-text-color); --wiki-navigation-dropdown-text-color--hover: var(--wiki-navigation-dropdown-text-color); --wiki-navigation-dropdown-font-size: var(--wiki-navigation-font-size); /* please use em or rem for this */ --wiki-navigation-dropdown-border-width: 1px; --wiki-navigation-dropdown-border-radius: var(--wiki-navigation-border-radius); --wiki-navigation-dropdown-padding: 0.25em; /* padding of the dropdown menu box */ --wiki-navigation-dropdown-item-padding: 0.625em; /* padding of each dropdown menu items */ --wiki-navigation-dropdown-item-background--hover: none; /* background of hover item */ --wiki-navigation-dropdown-border-image: none; --wiki-navigation-dropdown-backdrop-filter: none; --wiki-navigation-dropdown-box-shadow: none; /* box shadow */ /* styles of the footer */ --wiki-spacing-before-footer: 0px; --wiki-footer-border-image: none; /* padding on body element */ --wiki-top-spacing: calc(var(--wiki-is-top-logo)*var(--wiki-logo-margin) + (1 - var(--wiki-is-top-logo))*1em); /* extra spacing below wiki.gg netbar */ --wiki-left-spacing: 0.5em; --wiki-right-spacing: 1em; --wiki-bottom-spacing: 2em; /* end design variables */ } /*---------------------------------------- ***** END ADVANCED DESIGN VARIABLES ****** *****************************************/ /******************************* **** START SHARED VARIABLES **** **** tl;dr: don't edit this **** ********************************/ /* These variables are rarely touched, usually inherit other variables, and are shared on all themes. In 99% of cases none of these are ever edited, and you should only be doing so if you have a very clear vision, understand what you are doing, and *know* that what you are trying to do is not accomplished by changing another variable in the above sections. Since these are by default shared across all themes, if you support multiple themes you'll probably want to separate the variables you want to modify here into .view-x blocks like above. If you don't understand what that means or how to do that then you probably shouldn't be modifying this section. */ :root { --wiki-content-border-bottom-width: var(--wiki-content-border-width); --wiki-content-border-bottom-style: var(--wiki-content-border-style); --wiki-content-border-bottom-color: var(--wiki-content-border-color); --wiki-content-text-mix-color: color-mix(in srgb, var(--wiki-content-background-color), var(--wiki-content-text-color) 62%); --wiki-content-text-mix-color-95: color-mix(in srgb, var(--wiki-content-background-color) 95%, var(--wiki-content-text-color)); --wiki-content-text-color--hover: var(--wiki-content-text-color); /* heading */ --wiki-content-heading-border-bottom-width: 1px; --wiki-content-heading-border-style: solid; --wiki-content-heading-font-weight: normal; --wiki-content-heading-font-style: normal; --wiki-content-heading-text-transform: none; --wiki-content-heading-line-height: normal; --wiki-content-heading-text-shadow: none; /* first heading (h1) */ --wiki-content-firstheading-border-bottom-width: var(--wiki-content-heading-border-bottom-width); --wiki-content-firstheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-firstheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-firstheading-font-family: var(--wiki-content-heading-font-family); --wiki-content-firstheading-font-weight: var(--wiki-content-heading-font-weight); --wiki-content-firstheading-font-style: var(--wiki-content-heading-font-style); --wiki-content-firstheading-text-transform: var(--wiki-content-heading-text-transform); --wiki-content-firstheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-firstheading-color: var(--wiki-content-heading-color); --wiki-content-firstheading-text-shadow: none; /* sub-heading (h3, h4, h5, h6) */ --wiki-content-subheading-border-bottom-width: 0px; --wiki-content-subheading-border-style: var(--wiki-content-heading-border-style); --wiki-content-subheading-border-color: var(--wiki-content-heading-border-color); --wiki-content-subheading-font-family: var(--wiki-body-font-family); --wiki-content-subheading-font-weight: bold; --wiki-content-subheading-font-style: normal; --wiki-content-subheading-text-transform: none; --wiki-content-subheading-line-height: var(--wiki-content-heading-line-height); --wiki-content-subheading-color: var(--wiki-content-heading-color); --wiki-content-subheading-text-shadow: none; /* heading size */ --wiki-content-firstheading-font-size: 1.8em; --wiki-content-heading-h2-font-size: 1.5em; --wiki-content-heading-h3-font-size: 1.2em; --wiki-content-heading-h4-font-size: 114%; --wiki-content-heading-h5-font-size: 108%; --wiki-content-heading-h6-font-size: 100%; --wiki-content-toc-background: var(--wiki-content-background-color--secondary); --wiki-content-toc-border-width: 1px; --wiki-content-toc-border-style: solid; --wiki-content-toc-border-color: var(--wiki-content-border-color); --wiki-content-toc-border-radius: 0px; --wiki-content-toc-border-image: none; --wiki-content-toc-box-shadow: 0 0.1em 0.2em #000000; --wiki-content-catlinks-background: var(--wiki-content-background-color--secondary); --wiki-content-catlinks-border-width: 1px; --wiki-content-catlinks-border-style: solid; --wiki-content-catlinks-border-color: var(--wiki-content-border-color); --wiki-content-catlinks-border-radius: 0px; --wiki-content-catlinks-border-image: none; --wiki-content-catlinks-box-shadow: none; --wiki-content-filetoc-background: var(--wiki-content-background-color--secondary); --wiki-content-filetoc-border-width: 1px; --wiki-content-filetoc-border-style: solid; --wiki-content-filetoc-border-color: var(--wiki-content-border-color); --wiki-content-filetoc-border-radius: 0px; --wiki-content-filetoc-border-image: none; --wiki-content-filetoc-box-shadow: none; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; --wiki-sidebar-padding: 0px; --wiki-sidebar-background-color: var(--wiki-content-background-color); --wiki-sidebar-background-opacity: var(--wiki-content-background-opacity); --wiki-sidebar-background-image: none; --wiki-sidebar-background-position: center; --wiki-sidebar-background-repeat: repeat; --wiki-sidebar-background-size: auto; --wiki-sidebar-filter: none; --wiki-sidebar-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-sidebar-border-color: var(--wiki-content-border-color); --wiki-sidebar-border-style: solid; --wiki-sidebar-border-image: none; --wiki-sidebar-link-color: var(--wiki-content-link-color); --wiki-sidebar-link-color--hover: var(--wiki-content-link-color--hover); --wiki-sidebar-heading-color: var(--wiki-content-heading-color); --wiki-sidebar-heading-font-weight: normal; --wiki-sidebar-heading-font-style: normal; --wiki-sidebar-heading-text-transform: none; --wiki-sidebar-heading-line-height: normal; --wiki-sidebar-heading-padding: 0.5rem 0.25rem 0.5rem 0.5rem; --wiki-sidebar-heading-margin: 0px 0px -0.5rem 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-text-shadow: none; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-icon-to-link-filter: var(--wiki-icon-to-link-filter); --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-box-padding: 0px; --wiki-sidebar-box-background: none; --wiki-sidebar-box-border: 0px; --wiki-sidebar-box-border-image: none; --wiki-accent-color--hover: color-mix(in srgb, var(--wiki-accent-color) 90%, var(--wiki-accent-label-color)); --wiki-footer-border-width: var(--wiki-content-border-width); --wiki-footer-border-style: var(--wiki-content-border-style); --wiki-footer-border-color: var(--wiki-content-border-color); --wiki-footer-background-color: var(--wiki-content-background-color); --wiki-footer-background-opacity: var(--wiki-content-background-opacity); --wiki-footer-backdrop-filter: var(--wiki-content-backdrop-filter); --wiki-footer-text-color: var(--wiki-content-text-color); --wiki-footer-link-color: var(--wiki-content-link-color); --wiki-footer-link-color--hover: var(--wiki-content-link-color--hover); --wiki-footer-border-radius: var(--wiki-content-border-radius); --wiki-navigation-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-background-color--hover: var(--wiki-navigation-background-color); --wiki-navigation-background-opacity--hover: var(--wiki-navigation-background-opacity); --wiki-navigation-background-image--hover: var(--wiki-navigation-background-image); --wiki-navigation-background-position--hover: var(--wiki-navigation-background-position); --wiki-navigation-background-repeat--hover: var(--wiki-navigation-background-repeat); --wiki-navigation-background-size--hover: var(--wiki-navigation-background-size); --wiki-navigation-text-color--hover: var(--wiki-content-link-color--hover); --wiki-navigation-transform--hover: none; --wiki-navigation-selected-border-style: solid; --wiki-navigation-selected-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-border-style: solid; --wiki-navigation-border-color--hover: var(--wiki-navigation-border-color); --wiki-navigation-border-image--hover: var(--wiki-navigation-border-image); --wiki-navigation-border-bottom-color: var(--wiki-navigation-selected-border-color); --wiki-navigation-border-bottom-style: var(--wiki-navigation-selected-border-style); --wiki-navigation-border-bottom-width: calc(var(--wiki-is-navigation-inside-content, 0) * var(--wiki-navigation-selected-border-width, 1px) + (1 - var(--wiki-is-navigation-inside-content, 0)) * var(--wiki-content-border-width, 1px)); --wiki-navigation-icon-size: 1em; --wiki-navigation-tab-padding-x--icon: var(--wiki-navigation-tab-padding-x); --wiki-navigation-bottom-spacing: 0px; /* If you change this to greater than 0px, you should usually change the value of --wiki-navigation-selected-border-bottom-background to var(--wiki-navigation-border-bottom-color) */ --wiki-navigation-dropdown-background-color: var(--wiki-navigation-selected-background-color); --wiki-navigation-dropdown-background-opacity: var(--wiki-content-background-opacity); --wiki-navigation-dropdown-border-color: var(--wiki-navigation-border-color); --wiki-navigation-dropdown-offset: 0px; /* vertical offset */ --wiki-navigation-search-background-color: var(--wiki-content-background-color--secondary); --wiki-navigation-search-background-image: none; --wiki-navigation-search-background-position: 0; --wiki-navigation-search-background-size: auto; --wiki-navigation-search-background-repeat: repeat; --wiki-navigation-search-backdrop-filter: none; --wiki-navigation-search-border-color: var(--wiki-navigation-border-color); --wiki-navigation-search-border-color--hover: var(--wiki-accent-color); --wiki-navigation-search-border-style: solid; --wiki-navigation-search-border-width: 1px; --wiki-navigation-search-border-radius: 2px; --wiki-navigation-search-border-image: none; --wiki-navigation-search-border-image--hover: var(--wiki-navigation-search-border-image); --wiki-navigation-search-box-shadow: none; --wiki-navigation-search-box-shadow--hover: var(--wiki-navigation-search-box-shadow); --wiki-navigation-search-text-color: var(--wiki-content-text-color); --wiki-navigation-search-font-size: var(--wiki-navigation-font-size); --wiki-navigation-search-height: 2em; --wiki-navigation-search-button-color: currentColor; --wiki-navigation-search-button-color--hover: var(--wiki-navigation-search-button-color); --wiki-navigation-search-button-color-opacity: 80%; --wiki-navigation-search-button-color-opacity--hover: 95%; --wiki-navigation-search-bottom-spacing: 3px; --wiki-navigation-search-highlight-background-color: color-mix(in srgb, var(--wiki-accent-color) 5%, transparent); --wiki-navigation-gap-between-left-and-right: calc(max(0px, var(--wiki-navigation-tab-spacing))); /* minimum width between #left-navigation and #right-navigation before tabs start to collapse */ } /*** mobile adjustments ***/ @media screen and (max-width: 720px) { body.has-vector-mobile-menu{ --wiki-sidebar-offset: 0px; /* Vertical offset */ --wiki-sidebar-margin: 0px; --wiki-sidebar-heading-background: none; --wiki-sidebar-heading-border-image: none; --wiki-sidebar-heading-margin: 0px 0px -0.5em 0px; --wiki-sidebar-list-margin: 0px; --wiki-sidebar-list-background: none; --wiki-sidebar-list-border-image: none; --wiki-sidebar-list-item-background: none; --wiki-sidebar-list-item-border-image: none; --wiki-sidebar-list-item-background--hover: none; --wiki-sidebar-list-item-border-image--hover: none; --wiki-sidebar-list-item-spacing: 0px; --wiki-sidebar-line-height: 1.125; --wiki-sidebar-background-opacity: 100%; --wiki-navigation-search-border-width: 1px; --wiki-logo-offset-x: 0px; --wiki-logo-offset-y: 0px; } } /***************************** **** END SHARED VARIABLES **** ******************************/ /****************************************************************************************** ********************************* End user-edit variables ********************************* ******************************************************************************************/ /****************************** * Fallback for older browsers * * DONT EDIT THIS * *******************************/ @supports not (color:color-mix(in srgb, #000, transparent)) { .view-dark, .view-light, :root { --wiki-content-text-mix-color: var(--wiki-content-text-color); --wiki-content-text-mix-color-95: var(--wiki-content-background-color); --wiki-content-background-color--secondary: var(--wiki-content-dynamic-color--secondary--inverted); --wiki-content-border-color--secondary: var(--wiki-content-border-color); --wiki-content-border-color--accent: var(--wiki-accent-color); --wiki-accent-color--hover: var(--wiki-accent-color); --wiki-navigation-search-highlight-background-color: transparent; } } /***************************** * End older browser fallback * ******************************/ /***************************** * PortableInfoboxes * ******************************/ :root { --pi-background: var(--wiki-content-background-color); --pi-secondary-background: var(--wiki-accent-color); --pi-secondary-background-label: var(--wiki-accent-label-color); --pi-border-color: color-mix(in srgb, var(--pi-secondary-background) 50%, transparent); } .portable-infobox .pi-title, .portable-infobox .pi-header { text-align: center; font-size: 1.5em; background: color-mix(in srgb, var(--pi-secondary-background) 75%, transparent); color: var(--pi-secondary-background-label); } .portable-infobox .pi-data, .portable-infobox .pi-group { background: var(--wiki-content-background-color--secondary); } .portable-infobox .pi-image { padding: 8px; } .pi-image-thumbnail { max-width: 100%; } .pi-caption { color: var(--wiki-content-text-mix-color); } .pi-section-navigation .pi-section-tab.pi-section-active, .pi-section-navigation .pi-section-tab.current, .pi-media-collection .pi-tab-link.current { background: var(--pi-secondary-background); color: var(--pi-secondary-background-label); } .pi-collapse > .pi-item:first-child { cursor: pointer; } /* overqualify these to overwrite normal content heading styles */ .mw-body .portable-infobox h2, .mw-body .portable-infobox h3 { border-bottom: 0; font-family: inherit; font-weight: 700; margin: 0; } /***************************** * End PortableInfoboxes * ******************************/ /******************* * Main page layout * ********************/ #mp-container { display: grid; gap: 10px; } @media screen and (max-width: 990px) { /* for mobile screens */ #mp-container { grid-template-areas:var(--main-page-layout--mobile); grid-template-columns:var(--main-page-layout-columns--mobile, 100%); } .mp-box.mp-hide-on-mobile { display: none; } } @media screen and (min-width: 990px) and (max-width: 1350px) { /* for narrow screens, between 990px and 1350px */ #mp-container { grid-template-areas:var(--main-page-layout--tablet); grid-template-columns:var(--main-page-layout-columns--tablet, 1fr 1fr); } .mp-box.mp-hide-on-tablet { display: none; } } @media screen and (min-width: 1350px) { /* for all other screens, 1350px and wider */ #mp-container { grid-template-areas:var(--main-page-layout--desktop); grid-template-columns:var(--main-page-layout-columns--desktop, 2fr 1fr 2fr); } .mp-box.mp-hide-on-desktop { display: none; } } .mp-box { position: relative; display: flex; flex-flow: column nowrap; width: 100%; box-sizing: border-box; background: color-mix(in srgb, var(--wiki-content-background-color--secondary) 25%, transparent); border: 1px solid var(--wiki-content-border-color); padding: 0px; } .mp-body { height: 100%; display: flex; padding: 0.5em; flex-flow: column nowrap; } .mp-box.centered-content .mp-body { height: 100%; display: flex; flex-flow: column nowrap; justify-content: space-evenly; } .mp-box.has-floating-image { display: block; } .mp-box.has-floating-image .mp-body { height: unset; display: block; } /* overqualified to override normal heading styles */ .mw-body .mp-box h2 { text-align: center; font-weight: bold; font-family: var(--wiki-content-heading-font-family); overflow: initial; border-bottom: 1px solid var(--wiki-content-border-color); font-size: 150%; margin: 0; padding: 5px 0; color: var(--wiki-content-heading-color); } #mp-box-welcome { text-align: center; position: relative; overflow: hidden; } #mp-box-welcome h2 { font-size: 200%; } #mp-welcome { display: flex; flex-flow: column nowrap; position: relative; height: 100%; z-index: 2; box-sizing: border-box; } #mp-welcome .welcome-subtitle { height: 100%; background: color-mix(in srgb, var(--wiki-content-dynamic-color--inverted) 85%, transparent); padding: 0.5em; } #mp-banner { position: absolute; width: 100%; height: 100%; filter: blur(5px); z-index: -1; background: url(/images/e/e0/MP_banner.jpg); background-size: cover; background-repeat: no-repeat; background-position: top center; } .view-dark #mp-banner { filter: blur(5px) brightness(50%); } .view-light #mp-banner { filter: blur(5px) contrast(50%); } /* [[Template:MP_link]] */ .mp-links { --gap: 10px; } .mp-links > ul { display: flex; flex-flow: row wrap; justify-content: space-evenly; margin: 2px; gap: var(--gap); } .mp-links > ul > li { display: flex; flex-flow: column nowrap; align-items: stretch; text-align: center; box-sizing: border-box; flex: max(calc(50% - var(--gap)), 5em) 1 1; outline: 1px solid var(--wiki-content-link-color); transition: 0.1s ease-in; } .mp-links > ul > li:hover { background-color: color-mix(in srgb, var(--wiki-content-link-color) 20%, transparent); } .mp-links.columns-1 > ul > li {flex: max(calc(100% - var(--gap)), 5em) 1 1;} .mp-links.columns-2 > ul > li {flex: max(calc(50% - var(--gap)), 5em) 1 1;} .mp-links.columns-3 > ul > li {flex: max(calc((100% / 3) - var(--gap)), 5em) 1 1;} .mp-links.columns-4 > ul > li {flex: max(calc(25% - var(--gap)), 5em) 1 1;} .mp-links.columns-5 > ul > li {flex: max(calc(20% - var(--gap)), 5em) 1 1;} .mp-links.columns-6 > ul > li {flex: max(calc((100% / 6) - var(--gap)), 5em) 1 1;} .mp-links.columns-7 > ul > li {flex: max(calc((100% / 7) - var(--gap)), 5em) 1 1;} .mp-links.columns-8 > ul > li {flex: max(calc((100% / 8) - var(--gap)), 5em) 1 1;} .mp-links.columns-max > ul > li {flex: max(calc(0% - var(--gap)), 5em) 1 1;} .mp-links > ul > li:hover a { text-decoration: underline; } .mp-links > ul > li > a { display: flex; align-items: center; justify-content: center; height: 100%; flex: 1 1 auto; box-sizing: border-box; padding: 5px; } .mp-links > ul > li > a:first-child { height: 100%; } .mp-links > ul > li > a:last-child:not(:first-child) { height: unset; } .mp-links.stretch, .mp-links.stretch > ul { height: 100%; } .mp-links.side-image li { flex-flow: row nowrap; } .mp-links.plain > ul > li { outline-color: transparent; } /*********************** * End main page layout * ************************/ /********************************************************************************************************************* * Semantically-correct horizontal lists (for Module:Navbox, and they're more machine-readable than {{*}}-formatting) * **********************************************************************************************************************/ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: */ .hlist dt:not(:last-child)::after { content: ":\20"; } .hlist dd:not(:last-child)::after, .hlist li:not(:last-child)::after { /* "space, Middle Dot, space" We use unicode numbers instead of the raw characters due to a Firefox encoding bug on unicode characters. The space is also encoded because raw spaces combined with a unicode number strips the spaces under some conditions such as single-line lists */ /* content: "\20\00B7\20"; font-weight: bold; */ /* "space &nbsp; • &nbsp; space" There may (and likely) be an extra whitespace between <li>s, therefore we have to use a space character as last character of this sequence. By this way, the last space and the next whitespce will collapse as a single space, to make the whitespace on both sides of the middle dot the same width. */ content: "\20\A0\2022\A0\20"; font-weight: inherit; } /* Add parentheses around nested lists */ .hlist dd ol::before, .hlist dd ul::before, .hlist dd dl::before, .hlist dt ol::before, .hlist dt ul::before, .hlist dt dl::before, .hlist li ol::before, .hlist li ul::before, .hlist li dl::before { content: "\20("; font-weight: inherit; } .hlist dd ol::after, .hlist dd ul::after, .hlist dd dl::after, .hlist dt ol::after, .hlist dt ul::after, .hlist dt dl::after, .hlist li ol::after, .hlist li ul::after, .hlist li dl::after { content: ")"; font-weight: inherit; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) ".\20"; } /* Progressive enhancement: * try to make the dot always follow the list item in same line */ .hlist :is(li,dt,dd):not(:has(:is(li,dt,dd))) { display: inline-block; } /******************************************** * End semantically-correct horizontal lists * *********************************************/ /*** Miscellaneous ***/ .responsive-image { max-width: 100%; height: auto; } .view-dark .invert-on-dark, .view-light .invert-on-light { filter: invert(100%); } .pixelated { image-rendering: pixelated; } @media screen and (min-width: 720px) { .mobileonly { display: none; } } @media screen and (max-width: 720px) { .nomobile { display: none; } } /*** Utility classes for standard MW galleries ***/ /* it's important that spaced comes before centered in the sheet */ .gallery.gallery.gallery.spaced { /* this selector looks ridiculous but is actually part of stock Vector and therefore a necessary override */ display: flex; flex-flow: row wrap; justify-content: space-evenly; margin-left: unset; } .gallery.centered { text-align: center; } /************************** * Start Modular Templates * **************************/ /********* [[Template:Ambox]] *********/ .ambox { --ambox-color: var(--wiki-accent-color); border: 1px solid var(--wiki-content-border-color); border-left: 10px solid var(--ambox-color); border-radius: 2px; display: flex; align-items: center; gap: .6em; margin: 1em 0; padding: 3px .6em; background-color: var(--wiki-content-background-color--secondary); box-shadow: 2px 2px 5px 0px #0002; } @media (min-width: 720px) { .ambox { margin-inline: 10%; } } .ambox.tiny { padding: .04rem .5em; margin-inline: 0; width: fit-content; } .ambox + .ambox { margin-top: -.6em; } .ambox-content { flex: 1; } .ambox-content p { margin: .15em 0; } .ambox-title { font-weight: bold; } /********* [[Template:Hatnote]] *********/ .hatnote { padding: 1px 0 1px 1.6em; margin-bottom: 0.5em; font-style: italic; border-top: 1px solid var(--wiki-content-border-color--secondary); border-bottom: 1px solid var(--wiki-content-border-color--secondary); } .hatnote.icon { padding-left: 0; } /********* [[Template:Spoiler]] *********/ .spoiler-content { background-color: color-mix(in srgb, var(--wiki-content-dynamic-color) 50%, transparent); transition: all 0.3s; cursor: pointer; overflow: auto; } @supports not (color:color-mix(in srgb, #000, transparent)) { .spoiler-content { background-color: var(--wiki-content-dynamic-color--secondary); } } .spoiler-content > * { pointer-events: none; opacity: 0; transition: all 0.3s; } .spoiler-content.show { background-color: transparent; } .spoiler-content.show > * { pointer-events: unset; opacity: 1; } /********* [[Template:Link icon]] *********/ .link-icon { --link-icon-line-height: 1.5em; --link-icon-size: 1.5em; display: inline-flex; align-items: center; height: var(--link-icon-line-height); vertical-align: bottom; } .link-icon .regular { align-self: center; } .link-icon .regular a { display: flex; } .link-icon .regular img { height: var(--link-icon-size); max-width: var(--link-icon-size); } .link-icon .fallback { outline: 1px solid var(--wiki-content-text-color); border-radius: 50%; text-align: center; width: var(--link-icon-size); line-height: var(--link-icon-size); } .link-icon.notext, .link-icon.notext .fallback { display: inline-block; } /********* [[Template:Quote]] *********/ .quote { background: var(--wiki-content-background-color--secondary); border-radius: 5px; border: 2px solid var(--wiki-content-border-color); margin: .5em 0; padding: .5em; overflow-y: hidden; } .quote .block { display: block; } .quote .title { font-size: large; font-weight: bold; } .quote .content { font-style: italic; } .quote .author { font-weight: bold; text-align: end; } .quote .marks-wrapper { display: flex; gap: 5px; } .quote .marks-wrapper::before, .quote .marks-wrapper::after { font-size: 100px; line-height: 0px; } .quote .marks-wrapper::before { content: "\201C"; margin-top: 40px; } .quote .marks-wrapper::after { content: "\201D"; align-self: end; margin-bottom: -10px; } .client-js .mw-charinsert-item { display: none; } /************************ * End Modular Templates * *************************/ /***************************** * Used by [[Template:Color]] * ******************************/ .color__splotch { display: inline-block; height: 1em; width: 1em; box-sizing: border-box; vertical-align: text-top; border-radius: 50%; border: 1px solid var(--wiki-content-text-color); } /********************* * End Template:Color * **********************/ /********************************* * Used by [[Template:TOC limit]] * **********************************/ .toclimit-2 .toclevel-1 ul, .toclimit-3 .toclevel-2 ul, .toclimit-4 .toclevel-3 ul, .toclimit-5 .toclevel-4 ul, .toclimit-6 .toclevel-5 ul, .toclimit-7 .toclevel-6 ul { display: none; } /************************* * End Template:TOC limit * **************************/ /********************************* * Used by [[Template:TOC right]] * **********************************/ @media all and (min-width: 720px) { .tocright { float: right; clear: right; margin: 0 0 0.5em 1em; } } /************************* * End Template:TOC right * **************************/ 4a7903762df7411b028fa7d0ce46dca67d0559d5 File:Site-background-light.jpg 6 863 1367 2025-08-25T16:37:03Z Sharparam 284703 From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/ wikitext text/x-wiki == Summary == From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/ == Licensing == {{License|game}} e1998ae6a00a7eb247838ce82b0e75517d54eb6d 1370 1367 2025-08-25T16:44:22Z Sharparam 284703 Protected "[[File:Site-background-light.jpg]]": Part of skin ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite) [Upload=Allow only administrators] (indefinite)) wikitext text/x-wiki == Summary == From the SteamDB screenshots page: https://steamdb.info/app/1173220/screenshots/ == Licensing == {{License|game}} e1998ae6a00a7eb247838ce82b0e75517d54eb6d Template:Date 10 864 1371 2025-08-25T20:40:38Z Sharparam 284703 Created page with "{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d | dmy | rfc = j M Y | #default = {{{2|Y-m-d}}} }} }}<!-- -->{{#vardefine:dto|{{{1|now}}}}}<!-- --><time datetime="{{#time: Y-m-d|{{#var:dto}}}}"><!-- -->{{#time: {{#var:format}}|{{#var:dto}}}}<!-- --></time><noinclude> {{Documentation}}</noinclude>" wikitext text/x-wiki {{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d | dmy | rfc = j M Y | #default = {{{2|Y-m-d}}} }} }}<!-- -->{{#vardefine:dto|{{{1|now}}}}}<!-- --><time datetime="{{#time: Y-m-d|{{#var:dto}}}}"><!-- -->{{#time: {{#var:format}}|{{#var:dto}}}}<!-- --></time><noinclude> {{Documentation}}</noinclude> 69a10f946cbad0362ff4fff45fadc1ccba0232df Template:Date/doc 10 865 1372 2025-08-25T20:51:51Z Sharparam 284703 Created page with "Produces a properly formatted date in wiki articles. The output will be wrapped in a {{tag|time}} HTML tag where an ISO date is put in the <code>datetime</code> attribute, while the rendered format can be customized by using the second parameter of the template. For consistent reading of wikitext source, it is recommended to use ISO 8601 format for the input date parameter. == TemplateData == <templatedata> { "params": { "1": { "label": "Date object", "descr..." wikitext text/x-wiki Produces a properly formatted date in wiki articles. The output will be wrapped in a {{tag|time}} HTML tag where an ISO date is put in the <code>datetime</code> attribute, while the rendered format can be customized by using the second parameter of the template. For consistent reading of wikitext source, it is recommended to use ISO 8601 format for the input date parameter. == TemplateData == <templatedata> { "params": { "1": { "label": "Date object", "description": "The date object to format.", "example": "2025-08-25", "type": "line", "default": "now", "suggested": true }, "2": { "label": "Format", "description": "The format to use to display the time.", "example": "ISO", "type": "line", "suggestedvalues": [ "ISO", "RFC" ], "default": "ISO" } }, "description": "Produces a properly formatted date string", "paramOrder": [ "1", "2" ], "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Date}}</syntaxhighlight> &rarr; {{Date}} * <syntaxhighlight lang="wikitext" inline>{{Date|2023-05-16}}</syntaxhighlight> &rarr; {{Date|2023-05-16}} * <syntaxhighlight lang="wikitext" inline>{{Date||RFC}}</syntaxhighlight> &rarr; {{Date||RFC}} * <syntaxhighlight lang="wikitext" inline>{{Date|2008 5 aug}}</syntaxhighlight> &rarr; {{Date|2008 5 aug}} * <syntaxhighlight lang="wikitext" inline>{{Date|2012 9 apr|RFC}}</syntaxhighlight> &rarr; {{Date|2012 9 apr|RFC}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 851c165169cef35e22cd434843b54d8bbe4ad696 Template:Time 10 866 1373 2025-08-25T21:34:21Z Sharparam 284703 Created page with "{{#vardefine:time|{{{1|14:00}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | hm = H:i | hmo = H:iP | hms = H:i:s | hmso = H:i:sP | #default = {{{2|H:i}}} }} }}<!-- --><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:time}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#vardefine:time|{{{1|14:00}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | hm = H:i | hmo = H:iP | hms = H:i:s | hmso = H:i:sP | #default = {{{2|H:i}}} }} }}<!-- --><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:time}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude> 29da45daa0ccdc5ffb03e1c4f95a16956eb3ef41 1376 1373 2025-08-25T21:56:17Z Sharparam 284703 Fix default value wikitext text/x-wiki {{#vardefine:time|{{{1|now}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | hm = H:i | hmo = H:iP | hms = H:i:s | hmso = H:i:sP | #default = {{{2|H:i}}} }} }}<!-- --><time datetime="{{#time:H:i:sP|{{#var:time}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:time}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude> c1fe1669143f52a06573a8f71b02446b5398347e Template:Time/doc 10 867 1374 2025-08-25T21:53:19Z Sharparam 284703 Created page with "Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset. Note that this works differently from the Wikipedia [[wikipedia:Template:Time|]], as the Wikipedia version displays date {{em|and}} time. For date and time combined, use the {{tl|Datetime}} template. For now, this template requires well-formatted input. In the future, it might become more leni..." wikitext text/x-wiki Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset. Note that this works differently from the Wikipedia [[wikipedia:Template:Time|Template:Time]], as the Wikipedia version displays date {{em|and}} time. For date and time combined, use the {{tl|Datetime}} template. For now, this template requires well-formatted input. In the future, it might become more lenient to accept other input forms and convert it to well-formed output. The input only supports UTC time for now. == Examples == * <syntaxhighlight lang="wikitext" inline>{{Time}}</syntaxhighlight> &rarr; {{Time}} * <syntaxhighlight lang="wikitext" inline>{{Time|14:00}}</syntaxhighlight> &rarr; {{Time|14:00}} * <syntaxhighlight lang="wikitext" inline>{{Time|13:37|HMS}}</syntaxhighlight> &rarr; {{Time|13:37|HMS}} * <syntaxhighlight lang="wikitext" inline>{{Time|12:00|HMO}}</syntaxhighlight> &rarr; {{Time|12:00|HMO}} * <syntaxhighlight lang="wikitext" inline>{{Time|09:32:10|HMSO}}</syntaxhighlight> &rarr; {{Time|09:32:10|HMSO}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 72e4c662859a7ab7b64ff054e794b3a1f7bffd02 1375 1374 2025-08-25T21:55:45Z Sharparam 284703 Add TemplateData wikitext text/x-wiki Displays properly formatted time (no date). The output is wrapped in a {{tag|time}} tag so that the <code>datetime</code> attribute contains properly formatted time with offset. Note that this works differently from the Wikipedia [[wikipedia:Template:Time|Template:Time]], as the Wikipedia version displays date {{em|and}} time. For date and time combined, use the {{tl|Datetime}} template. For now, this template requires well-formatted input. In the future, it might become more lenient to accept other input forms and convert it to well-formed output. The input only supports UTC time for now. == TemplateData == <templatedata> { "params": { "1": { "label": "Time", "description": "The time to format.", "example": "13:37", "type": "line", "default": "now", "suggested": true }, "2": { "label": "Format", "description": "How to format the displayed time. An \"O\" at the end will show the UTC offset (currently always 0).", "example": "HMS", "type": "line", "suggestedvalues": [ "HMS", "HMSO", "HM", "HMO" ], "default": "HM" } }, "description": "Displays formatted time.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Time}}</syntaxhighlight> &rarr; {{Time}} * <syntaxhighlight lang="wikitext" inline>{{Time|14:00}}</syntaxhighlight> &rarr; {{Time|14:00}} * <syntaxhighlight lang="wikitext" inline>{{Time|13:37|HMS}}</syntaxhighlight> &rarr; {{Time|13:37|HMS}} * <syntaxhighlight lang="wikitext" inline>{{Time|12:00|HMO}}</syntaxhighlight> &rarr; {{Time|12:00|HMO}} * <syntaxhighlight lang="wikitext" inline>{{Time|09:32:10|HMSO}}</syntaxhighlight> &rarr; {{Time|09:32:10|HMSO}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 69b056ff8cd2593206dcaad106fb0de3821c556c Template:Datetime 10 868 1377 2025-08-27T18:14:06Z Sharparam 284703 Created page with "{{#vardefine:dto|{{{1|now}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+00:00}} | rfc | #default = {{{2|D, j M Y H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+0000}}}}} }}}}<!-- --><time datetime="{{#time:c|{{#var:dto}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:dto}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#vardefine:dto|{{{1|now}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+00:00}} | rfc | #default = {{{2|D, j M Y H:i{{#if:{{Yesno|{{{seconds|}}}}}|:s}}{{#if:{{Yesno|{{{offset|}}}}}|+0000}}}}} }}}}<!-- --><time datetime="{{#time:c|{{#var:dto}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:dto}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude> ee01e3f343e8a1b1df09400b4cf410beaf9afc11 1379 1377 2025-08-27T18:39:25Z Sharparam 284703 Improve options wikitext text/x-wiki {{#vardefine:dto|{{{1|now}}}}}<!-- -->{{#vardefine:format|{{#switch:{{lc:{{{2}}}}} | iso = Y-m-d H:i{{Yesno|{{{seconds|}}}|yes=\:s}}" UTC" | rfc | #default = {{Yesno|{{{weekday|yes}}}|yes=D," "}}j M Y H:i{{Yesno|{{{seconds|}}}|yes=\:s}}" UTC" }}}}<!-- --><time datetime="{{#time:c|{{#var:dto}}}}"><!-- -->{{#time:{{#var:format}}|{{#var:dto}}}}<!-- --></time><!-- --><noinclude>{{Documentation}}</noinclude> 57bb4bc267f7c3a6089e627dffb9cefed991c706 Template:Datetime/doc 10 869 1378 2025-08-27T18:26:26Z Sharparam 284703 Created page with "Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight. Output is always in UTC (for now), but input can be any offset as long as it is specified. Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable..." wikitext text/x-wiki Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight. Output is always in UTC (for now), but input can be any offset as long as it is specified. Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact. == TemplateData == <templatedata> { "params": { "1": { "label": "Datetime", "description": "The date and time to format.", "example": "2025-08-27 13:37", "type": "date", "default": "now", "suggested": true }, "2": { "label": "Format", "description": "How to format the date.", "example": "rfc", "type": "line", "suggestedvalues": [ "iso", "rfc" ], "default": "rfc" }, "seconds": { "label": "Seconds", "description": "Whether to include seconds in formatted display.", "example": "yes", "type": "boolean", "default": "no" } }, "description": "Formats a date with time component.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> &rarr; {{Datetime}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> &rarr; {{Datetime|2023-07-12}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> &rarr; {{Datetime|2024-10-05 13:37}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> &rarr; {{Datetime|2020-12-12 16:20+01:00}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> &rarr; {{Datetime|2005-03-28 05:48:33|seconds=yes}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> &rarr; {{Datetime||iso}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> &rarr; {{Datetime||rfc}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 29706c7760147a2125de6dfeaaaea7d5dc53e05e 1380 1378 2025-08-27T18:41:35Z Sharparam 284703 Document weekday parameter and add more examples wikitext text/x-wiki Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight. Output is always in UTC (for now), but input can be any offset as long as it is specified. Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact. == TemplateData == <templatedata> { "params": { "1": { "label": "Datetime", "description": "The date and time to format.", "example": "2025-08-27 13:37", "type": "date", "default": "now", "suggested": true }, "2": { "label": "Format", "description": "How to format the date.", "example": "rfc", "type": "line", "suggestedvalues": [ "iso", "rfc" ], "default": "rfc" }, "seconds": { "label": "Seconds", "description": "Whether to include seconds in formatted display.", "example": "yes", "type": "boolean", "default": "no" }, "weekday": { "label": "Weekday (RFC)", "description": "Show weekday when using RFC format.", "example": "no", "type": "boolean", "default": "yes" } }, "description": "Formats a date with time component.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> &rarr; {{Datetime}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> &rarr; {{Datetime|2023-07-12}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> &rarr; {{Datetime|2024-10-05 13:37}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> &rarr; {{Datetime|2020-12-12 16:20+01:00}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> &rarr; {{Datetime|2005-03-28 05:48:33|seconds=yes}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12|weekday=no}}</syntaxhighlight> &rarr; {{Datetime|2023-07-12|weekday=no}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> &rarr; {{Datetime||iso}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||iso|seconds=yes}}</syntaxhighlight> &rarr; {{Datetime||iso}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> &rarr; {{Datetime||rfc}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 7e4c510ec7e75db86e673727c7d89720d1b2c47c 1381 1380 2025-08-27T18:43:36Z Sharparam 284703 Fix missing parameter in rendered example wikitext text/x-wiki Formats a given input date (and time) according to wiki standards. If no date is given it will use the current date and time. If no time is given it will use midnight. Output is always in UTC (for now), but input can be any offset as long as it is specified. Currently, only ISO and RFC formats are supported, to ensure datetime strings across the wiki are consistent. The RFC format is likely more readable in article body text, while the ISO format might be more suitable in places like infoboxes or table data since it is more compact. == TemplateData == <templatedata> { "params": { "1": { "label": "Datetime", "description": "The date and time to format.", "example": "2025-08-27 13:37", "type": "date", "default": "now", "suggested": true }, "2": { "label": "Format", "description": "How to format the date.", "example": "rfc", "type": "line", "suggestedvalues": [ "iso", "rfc" ], "default": "rfc" }, "seconds": { "label": "Seconds", "description": "Whether to include seconds in formatted display.", "example": "yes", "type": "boolean", "default": "no" }, "weekday": { "label": "Weekday (RFC)", "description": "Show weekday when using RFC format.", "example": "no", "type": "boolean", "default": "yes" } }, "description": "Formats a date with time component.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Datetime}}</syntaxhighlight> &rarr; {{Datetime}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12}}</syntaxhighlight> &rarr; {{Datetime|2023-07-12}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2024-10-05 13:37}}</syntaxhighlight> &rarr; {{Datetime|2024-10-05 13:37}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2020-12-12 16:20+01:00}}</syntaxhighlight> &rarr; {{Datetime|2020-12-12 16:20+01:00}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2005-03-28 05:48:33|seconds=yes}}</syntaxhighlight> &rarr; {{Datetime|2005-03-28 05:48:33|seconds=yes}} * <syntaxhighlight lang="wikitext" inline>{{Datetime|2023-07-12|weekday=no}}</syntaxhighlight> &rarr; {{Datetime|2023-07-12|weekday=no}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||iso}}</syntaxhighlight> &rarr; {{Datetime||iso}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||iso|seconds=yes}}</syntaxhighlight> &rarr; {{Datetime||iso|seconds=yes}} * <syntaxhighlight lang="wikitext" inline>{{Datetime||rfc}}</syntaxhighlight> &rarr; {{Datetime||rfc}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 2b120d6e34b188f18aff214200d2f11165f5ccd6 Meta:Manual of Style 4 845 1382 1348 2025-08-27T18:52:45Z Sharparam 284703 /* Formatting */ Add guideline for dates and time wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. === Date and time === In order to have dates and time be consistent across the wiki, there are a few templates to help: ;{{tl|Date}} :For just a date with no associated time. ;{{tl|Time}} :For just a time with no associated date. ;{{tl|Datetime}} :When both date and time are needed. The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}"). In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones. The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) * Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. [[Category:Manual of Style]] 5a1e69ff3f11b3b0e7789858c6c080b406db474c 1383 1382 2025-08-27T18:59:19Z Sharparam 284703 Add section on language wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Language == Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that. Above all, strive to maintain proper grammar and punctuation. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. === Date and time === In order to have dates and time be consistent across the wiki, there are a few templates to help: ;{{tl|Date}} :For just a date with no associated time. ;{{tl|Time}} :For just a time with no associated date. ;{{tl|Datetime}} :When both date and time are needed. The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}"). In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones. The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) * Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. [[Category:Manual of Style]] f5b3fdee2195496df1bd7d013c183c1c81ed7318 1384 1383 2025-08-27T19:08:06Z Sharparam 284703 /* Date and time */ Add more details on date/time formatting wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Language == Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that. Above all, strive to maintain proper grammar and punctuation. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. === Date and time === In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00"). There are a few templates to help: ;{{tl|Date}} :For just a date with no associated time. ;{{tl|Time}} :For just a time with no associated date. ;{{tl|Datetime}} :When both date and time are needed. The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}"). In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones. The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) * Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. [[Category:Manual of Style]] fc4bb4566e1facec577a3150b50ec49fa1bbbfc7 1386 1384 2025-08-27T21:28:49Z Sharparam 284703 /* Infoboxes */ Put bosses under enemies wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Language == Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that. Above all, strive to maintain proper grammar and punctuation. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. === Date and time === In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00"). There are a few templates to help: ;{{tl|Date}} :For just a date with no associated time. ;{{tl|Time}} :For just a time with no associated date. ;{{tl|Datetime}} :When both date and time are needed. The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}"). In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones. The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) ** Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. [[Category:Manual of Style]] c96fc7923c8afa02b611d0b8d734b16df5e61dab 1387 1386 2025-08-27T21:49:13Z Sharparam 284703 Add section on references and notes wikitext text/x-wiki This '''Manual of Style''' ('''MoS''' or '''MOS''') is the [[wikipedia:Style manual|style manual]] for the {{BFF}} wiki. Some of it is adapted from other wikis like [https://en.wikipedia.org Wikipedia]. This will be a living document and likely change over time. If there's ever anything in the article that feels unclear, confusing, or even contradicts itself, please use the [[Meta talk:Manual of Style|talk page]] or contact wiki administrators to have it clarified. == Language == Whether you write with an American or British variant of English is not of the utmost importance, just try to stay consistent. Since the game uses American English, try to stick to that. Above all, strive to maintain proper grammar and punctuation. == Layout == Overall, follow the same layout guidelines as used on Wikipedia ([[wikipedia:Wikipedia:Manual of Style/Layout|Wikipedia:Manual of Style/Layout]]). This wiki has some common sections that do not appear on Wikipedia though, like <q>Location(s)</q>, <q>Acquisition</q>, and <q>Trivia</q>. === Location and acquisition === These are important sections and often what readers are interested in when looking up an item for example. As such, they should appear early, but after the main body content of an article, so usually following the <q>Overview</q> section (if present). === Bugs === The bugs section is considered part of the appendices, and should appear as the first appendix item following the main content of an article. === Trivia === The trivia section is considered part of the appendices, and should appear after [[#Bugs|Bugs]]. === Other sections === Sometimes it can be useful to divide an article into more unique sections, like how location articles will have sections listing items, enemies, bosses, and NPCs. Use your best judgment for where these should be placed, as long as they come after the <q>Overview</q> section. == Formatting == === Emphasis === Due to how Wikitext works, using single quotes to produce italics, bold, or bolded italics (<code><nowiki>''...''</nowiki></code>, <code><nowiki>'''...'''</nowiki></code>, and <code><nowiki>'''''...'''''</nowiki></code>) results in simple typographical styles (with the HTML {{tag|i|open}} and {{tag|b|open}} tags). When {{em|semantic}} emphasis is what is desired, use the {{tl|Em}} template to produce it (or the {{tag|em}} HTML tag, but the template should be more convenient). For strong semantic emphasis, use the {{tl|Strong}} template which uses the {{tag|strong}} HTML tag. === Date and time === In order to have dates and time be consistent across the wiki, use either [[wikipedia:ISO 8601|ISO 8601]] or [[wikipedia:RFC 3339|RFC 3339]] to format them. For readability, it's not necessary to display seconds or the weekday, and offset can be specified with letters instead of numbers (like "UTC" instead of "+00:00"). There are a few templates to help: ;{{tl|Date}} :For just a date with no associated time. ;{{tl|Time}} :For just a time with no associated date. ;{{tl|Datetime}} :When both date and time are needed. The templates are currently only able to output dates and times adjusted to UTC (e.g., if you give {{tl|Datetime}} an input of <code>2025-08-27 20:48+02:00</code>, it will render as "{{Datetime|2025-08-27 20:48+02:00}}"). In the future, the templates might be condensed down to a single one that can handle different variants of dates and/or time with support for rendering differerent timezones. The Wikipedia date/time templates were specifically {{em|not}} copied to this wiki because they do not render into a {{tag|time}} element which makes them worse for accessibility and semantics. == Infoboxes == Infoboxes are very useful to allow readers to quickly see important information in a structured manner that will be consistent between articles. They also help to apply categories to a page. The following types of articles must have an infobox: * NPCs ({{tl|Infobox/NPC}}) * Enemies ({{tl|Infobox/Enemy}}) ** Bosses ({{tl|Infobox/Boss}}) * Items ({{tl|Infobox/Item}}) ** Weapons ({{tl|Infobox/Weapon}}) ** Armor ({{tl|Infobox/Armor}}) ** Capes ({{tl|Infobox/Cape}}) ** Shields ({{tl|Infobox/Shield}}) ** Armor set ({{tl|Infobox/Armor set}}) ** Amulets ({{tl|Infobox/Amulet}}) * Abilities ({{tl|Infobox/Ability}}) * Passives ({{tl|Infobox/Passive}}) There may be other infoboxes not covered in this manual, the [[:Category:Infobox templates|infobox templates category]] will list all the currently existing infobox templates. The base {{ml|Infobox}} module should {{strong|never}} be used in an article. It is only used to create more specialized infoboxes. (Though you can use it to spice up your user page if you want, just don't use it in mainspace content.) When possible, the image used in the infobox should be an asset extracted from the game. When not possible, take a screenshot in the game and make sure the subject is clearly visible and isolated from unrelated objects with the background as clean as you can manage. Keep in mind that infobox images will be sized to 300 pixels wide. (Some game assets are smaller than 300 pixels, and then there isn't much you can do, so just allow it to stretch.) Infoboxes should be put at the top of an article, before the lead text. == Navboxes == Navboxes (or navigation boxes) are put at the end of articles (before any categories) to help readers navigate between related content, like weapons. See the [[:Category:Navigation templates|navigation templates category]] for currently existing navboxes. Use the navbox most relevant for the type of content being edited. For example: Use the weapons navbox ({{tl|Navbox/Weapons}}) on a weapon page instead of the entire items navbox ({{tl|Navbox/Items}}), as using the latter would result in an overwhelming number of links and is less likely to be relevant to the reader. Sometimes multiple navboxes might be relevant, with only one being the primary or most relevant. An example of this is ammunition. Longbows are very relevant and related to arrows, so it can be useful to have the longbows navbox on the page for an arrow type. [[Metal Arrows]] is an example of this. As the second navbox is secondary, it has been set to default to the collapsed state with the help of the {{para|state}} parameter on the navbox template: <syntaxhighlight lang="wikitext" inline>{{Navbox/Longbows|state=collapsed}}</syntaxhighlight>. == References and notes == For references, use the {{tl|Ref}}{{note|Works more like the Wikipedia [[wikipedia:Template:Refn|Template:Refn]] template rather than [[wikipedia:Template:Ref|Template:Ref]]}} template or {{tag|ref}} tag. For notes it might be preferable to use the {{tl|Note}}{{note|Works more like the Wikipedia [[wikipedia:Template:Efn|Template:Efn]] template rather than [[wikipedia:Template:Note|Template:Note]]}} template to ensure the proper lettering is used. <syntaxhighlight lang="wikitext"> Sometimes text might need notes, things that aren't important enough to add in the text but still interesting.{{note|Usually at the end of a sentence but could also go directly after a word}} </syntaxhighlight> If you've used references and/or notes in an article, make sure to put the {{tl|Reflist}} or {{tl|Notelist}} under an appropriate section at the end of the article. <syntaxhighlight lang="wikitext"> == References == {{Reflist}} </syntaxhighlight> <syntaxhighlight lang="wikitext"> == Notes == {{Notelist}} </syntaxhighlight> == Notes == {{Notelist}} [[Category:Manual of Style]] 765a51a9d69cd9a48d761ba41aa9e357306fa18a Template:Link icon 10 93 1385 115 2025-08-27T21:26:17Z Sharparam 284703 Make template more flexible wikitext text/x-wiki <includeonly>{{#vardefine:target|{{{1|}}}<!-- end vd -->}}<!-- -->{{#vardefine:display|{{#if:{{{2|}}}|{{{2}}}|{{{1}}}<!-- end if -->}}<!-- end vd -->}}<!-- -->{{#vardefine:type|{{{type|Icon}}}}}<!-- -->{{#vardefine:file|{{#or:{{{file|}}}|{{{icon|}}}|{{{i|}}}|{{#var:target}}_({{#var:type}}).png}}}}<!-- -->{{#vardefine:iconSize|1.2em}}<!-- -->{{#vardefine:lineHeight|1lh}}<!-- -->{{#vardefine:fileExists|{{filepath:{{#var:file}}}}}}<!-- -->{{#ifeq: {{{2|}}} | notext <!-- start if notext -->|<span class="link-icon notext" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start notext icon element -->{{#if: {{#var:fileExists}} <!-- start icon if -->| <span class="regular">[[File:{{#var:file}}|link={{#var:target}}|alt=]]</span><!-- end regular icon -->| <span class="fallback">[[File:{{#var:file}}|?]]</span><!-- end fallback icon (?) -->}}<!-- end icon if --></span><!-- end notext icon -->|<span class="link-icon" style="--link-icon-size: {{#var:iconSize}}; --link-icon-line-height: {{#var:lineHeight}};"><!-- start icon + text element -->{{#if: {{#var:fileExists}} <!-- start icon if -->| <span class="regular">[[File:{{#var:file}}|link={{#var:target}}|alt=]]</span><!-- end regular icon -->| <span class="fallback">[[File:{{#var:file}}|?]]</span><!-- end fallback icon (?) -->}}&nbsp;<!-- end icon if --><span class="display-text">[[{{#var:target}}|{{#var:display}}]]</span><!-- end display text --></span> <!-- end icon + text element -->}}<!-- end if notext --></includeonly><noinclude>{{Documentation}}[[Category:Formatting templates]]</noinclude> 230ff98716418fda1b91a4bef631fd4d3b59e9d4 Template:Reflist 10 613 1388 964 2025-08-27T21:52:48Z Sharparam 284703 Add "From Wikipedia" hatnote wikitext text/x-wiki <noinclude>{{From Wikipedia|Template:Reflist}}</noinclude> <templatestyles src="Reflist/styles.css" /><div class="reflist<!-- -->{{#if:{{{1|}}}{{{colwidth|}}}|&#32;reflist-columns references-column-width}} {{#switch:{{{liststyle|{{{group|}}}}}} | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = reflist-{{{liststyle|{{{group}}}}}} }}" <!-- End class, start style -->{{#if:{{{1|}}} | {{#iferror:{{#ifexpr: {{{1|1}}} > 1 }} |style="column-width: {{{1}}};"}} | {{#if: {{{colwidth|}}}|style="column-width: {{{colwidth}}};"}} }}> {{#tag:references|{{{refs|}}}|group={{{group|}}}|responsive={{#if:{{{1|}}}{{{colwidth|}}}|0|1}}}}</div>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using reflist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Reflist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | liststyle | refs }}<noinclude> {{Documentation}}</noinclude> cc488133007cdd7b115041428db504520c79b5fa Template:Reflist/doc 10 870 1389 2025-08-27T21:53:30Z Sharparam 284703 Created page with "== See also == * {{tl|Notelist}} <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == See also == * {{tl|Notelist}} <noinclude>[[Category:Template documentation]]</noinclude> 817edb987852c4e815df8f37224ac7a4a3803a65 Template:Notelist 10 612 1390 962 2025-08-27T21:54:06Z Sharparam 284703 Add "From Wikipedia" hatnote wikitext text/x-wiki <noinclude>{{From Wikipedia|Template:Notelist}}</noinclude> {{safesubst<noinclude />:Reflist|{{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group={{safesubst<noinclude />:#switch:{{{group|}}} | note | upper-alpha | upper-roman | lower-alpha | lower-greek | lower-roman = {{{group|}}} | #default = lower-alpha }}}}{{safesubst<noinclude />:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using notelist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Notelist]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | colwidth | group | notes | refs }}<noinclude> {{Documentation}}</noinclude> 0af30996296b737c6ca255e4040297f50dd6946f Template:Notelist/doc 10 871 1391 2025-08-27T21:54:30Z Sharparam 284703 Created page with "== See also == * {{tl|Reflist}} <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki == See also == * {{tl|Reflist}} <noinclude>[[Category:Template documentation]]</noinclude> d3a0215a15adc85cdb42fbded8ec28b067119585 Plagued 0 872 1392 2025-09-05T21:13:01Z Sharparam 284703 Created page with "{{Infobox/Enemy | image = Plagued (enemy).png }} '''Plagued''' is an enemy that appears in the [[Monastery]] location in {{BFF}}. {{Navbox/Enemies}}" wikitext text/x-wiki {{Infobox/Enemy | image = Plagued (enemy).png }} '''Plagued''' is an enemy that appears in the [[Monastery]] location in {{BFF}}. {{Navbox/Enemies}} 4a165eb28c85124eb2c8fef58807ad6ddc23d3d5 File:Plagued (enemy).png 6 873 1393 2025-09-05T21:13:28Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 File:Konrad the Traitor.png 6 874 1394 2025-09-05T21:13:57Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Mrgud 0 875 1395 2025-09-05T21:37:19Z Sharparam 284703 Created page with "{{Infobox/Enemy | image = Mrgud (enemy).png }} '''Mrgud''' is an enemy in {{BFF}}. {{Navbox/Enemies}}" wikitext text/x-wiki {{Infobox/Enemy | image = Mrgud (enemy).png }} '''Mrgud''' is an enemy in {{BFF}}. {{Navbox/Enemies}} 643454a9c803b899b1b971828c544b8f7690aac6 File:Mrgud (enemy).png 6 876 1396 2025-09-05T21:37:32Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Mysterious Woman 0 877 1397 2025-09-05T21:54:44Z Sharparam 284703 Created page with "{{Infobox/NPC | image = Mysterious Woman (NPC).png }} '''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}. == Location == Located in [[Blok 6147]]. == Quotes == === First encounter === {{Quote |I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm… So… What do you think of the city? Quite a few nutcases eh? Stealing always has deep roots among the poor. The children steal, and fathers and mothers too!..." wikitext text/x-wiki {{Infobox/NPC | image = Mysterious Woman (NPC).png }} '''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}. == Location == Located in [[Blok 6147]]. == Quotes == === First encounter === {{Quote |I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm… So… What do you think of the city? Quite a few nutcases eh? Stealing always has deep roots among the poor. The children steal, and fathers and mothers too! Back when I was on duty in the rough quarters, I would often be robbed of whatever I happened to be carrying. My cloak, my gloves, even my tools… what do they even do with such things? I was performing a surgery on one of the afflicted once, with his family standing there. I'm about to give him a sip of the [[Asylum Brew|asylum brew]] to ease the pain, and when I turn back – it's gone! The little ones, smiling at me with their tiny teeth… He he he… Agh… Probably addicted to it… Kleptomania. Another condition that needs curing… Say – that vessel of yours? Now that's something I'd tinker with… How much would you sell it for? They say there's no genius without a touch of madness… What about those where madness is in abundance? Ha ha ha! Ahhh… *hums happily* }} === After first encounter === {{Quote|Ahhh… *hums happily*}} {{Navbox/NPCs}} 7f7e634bf9fdb130dcd499953d2907f97f7a18d9 1399 1397 2025-09-05T22:05:36Z Sharparam 284703 /* Location */ Add coordinates wikitext text/x-wiki {{Infobox/NPC | image = Mysterious Woman (NPC).png }} '''{{PAGENAME}}''' is an [[NPCs|NPC]] in {{BFF}}. == Location == {{coords|-16812.77|-10253.53|2049.22}} Located in [[Blok 6147]]. == Quotes == === First encounter === {{Quote |I know what you are… But – how can there be anything interesting about a being that never transforms? Hm hm hm… So… What do you think of the city? Quite a few nutcases eh? Stealing always has deep roots among the poor. The children steal, and fathers and mothers too! Back when I was on duty in the rough quarters, I would often be robbed of whatever I happened to be carrying. My cloak, my gloves, even my tools… what do they even do with such things? I was performing a surgery on one of the afflicted once, with his family standing there. I'm about to give him a sip of the [[Asylum Brew|asylum brew]] to ease the pain, and when I turn back – it's gone! The little ones, smiling at me with their tiny teeth… He he he… Agh… Probably addicted to it… Kleptomania. Another condition that needs curing… Say – that vessel of yours? Now that's something I'd tinker with… How much would you sell it for? They say there's no genius without a touch of madness… What about those where madness is in abundance? Ha ha ha! Ahhh… *hums happily* }} === After first encounter === {{Quote|Ahhh… *hums happily*}} {{Navbox/NPCs}} d3e154aa9bceae43c67269d0dabf71eadba4d303 File:Mysterious Woman (NPC).png 6 878 1398 2025-09-05T21:56:55Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Royal Division Captain Yulia 0 404 1400 570 2025-09-05T22:12:52Z Sharparam 284703 Add quotes wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia.png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Quotes == === First encounter === {{Quote |This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace. I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must. I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal… I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors. This crusade has gone on for too long, yet… it seems as i we have only arrived here. I miss the wind… The cold air, weaving its way around you as you take in the horizon. To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel. I do not merely rely on you – I trust in you. Don't let me down. [[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond… Farewell. }} === After first encounter === {{Quote|Farewell.}} {{Navbox/NPCs}} 90533fb05e4c12a2da999195cc5b65fabc8a25b7 1401 1400 2025-09-05T22:14:46Z Sharparam 284703 Update file name wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia (NPC).png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Quotes == === First encounter === {{Quote |This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace. I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must. I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal… I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors. This crusade has gone on for too long, yet… it seems as i we have only arrived here. I miss the wind… The cold air, weaving its way around you as you take in the horizon. To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel. I do not merely rely on you – I trust in you. Don't let me down. [[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond… Farewell. }} === After first encounter === {{Quote|Farewell.}} {{Navbox/NPCs}} 974fe267dcce99e38060a681e8b441903fe7fca0 File:Royal Division Captain Yulia (NPC).png 6 879 1402 2025-09-05T22:14:58Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Royal Division Captain Yulia 0 404 1403 1401 2025-09-05T22:16:42Z Sharparam 284703 Add location wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Royal Division Captain Yulia & Vermillion Mirage}} {{Infobox/NPC | image = Royal Division Captain Yulia (NPC).png }} {{stub}} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|1070.06|23609.71|3546.89}} Located in [[Blok 6147]], in a tower surrounded by several [[Dreadguard (NPC)|dreadguards]] (non-hostile NPC variant). == Quotes == === First encounter === {{Quote |This crusade is not only about the city… [[Yaroslav]] is to be apprehended. As long as his example can inspire others, there can be no peace. I hope you don't judge what you see. We both know justice exists only between those equal in strength. For as it stands, the strong do what they wish, and the weak suffer what they must. I will confide in you a recent detail. There is a traitor within our higher ranks – I can tolerate many things… but betrayal… I'll speak frankly with you… This population is lost. The corruption spreads from the [[anomaly]], and even our soldiers are affected… As for the citizens, they were strange to begin with… but many are now completely off the handle. So… I ask of you kindly… Do your part, and I'll see to it that we all return as victors. This crusade has gone on for too long, yet… it seems as i we have only arrived here. I miss the wind… The cold air, weaving its way around you as you take in the horizon. To guide by authority, to graft tradition onto peace, to bestow mercy upon the conquered… to wage war until the proud kneel. I do not merely rely on you – I trust in you. Don't let me down. [[The Serdar]] occupation of the gate is only a part of the problem. We also have to deal with the corruption from beyond… Farewell. }} === After first encounter === {{Quote|Farewell.}} {{Navbox/NPCs}} 415add9447f36d855407d028a064f1cb7a9bc5b9 Module:Coordinates 828 296 1404 397 2025-09-05T22:18:30Z Sharparam 284703 Fix tooltip formatting Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = tonumber(args.x or args[1]) or 0 local y = tonumber(args.y or args[2]) or 0 local z = tonumber(args.z or args[3]) or 0 local xdec = string.sub(tostring(math.fmod(x, 1)), 3) local ydec = string.sub(tostring(math.fmod(y, 1)), 3) local zdec = string.sub(tostring(math.fmod(z, 1)), 3) local inaccurate = #xdec ~= 2 or #ydec ~= 2 or #zdec ~= 2 local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z) local elem = mw.html.create('span') :css('border-bottom', '1px dotted') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if inaccurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end return elem end return p ab0a90c4228892278acd05c8f2df9ebb54fd4375 1405 1404 2025-09-05T22:27:08Z Sharparam 284703 Fix accuracy check Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local CHECK_PATTERN = "^-?%d+%.%d%d$" local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = args.x or args[1] or "" local y = args.y or args[2] or "" local z = args.z or args[3] or "" local accurate_x = string.match(x, CHECK_PATTERN) ~= nil local accurate_y = string.match(y, CHECK_PATTERN) ~= nil local accurate_z = string.match(z, CHECK_PATTERN) ~= nil local accurate = accurate_x or accurate_y or accurate_z x = tonumber(z) or 0 y = tonumber(z) or 0 z = tonumber(z) or 0 local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z) local elem = mw.html.create('span') :css('border-bottom', '1px dotted') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if not accurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end return elem end return p 2ff934a8e25efa2dcfbbe7d4844d814eaf22c9c0 Homunculus 0 611 1406 975 2025-09-05T22:33:54Z Sharparam 284703 /* List of homunculi */ Add rain district (sewers) location wikitext text/x-wiki '''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Description !! Coordinates |- | [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}} |- | [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}} |- | [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}} |- | [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}} |- | [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}} |- | [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}} |- | [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}} |- | [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}} |- | [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}} |- | [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}} |- | [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}} |- | rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}} | Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}} |- | After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}} |- | After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}} |} == Notes == {{notelist|refs= {{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}} }} == External links == * [[wikipedia:Homunculus|Homunculus on Wikipedia]] fe28773901e0f42e513362bb666249532e046239 1407 1406 2025-09-05T22:56:22Z Sharparam 284703 /* List of homunculi */ Add rain district (center) location wikitext text/x-wiki '''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Description !! Coordinates |- | [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}} |- | [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}} |- | [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}} |- | [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}} |- | [[Rain District#Center|Rain District (Center)]] || Located at the bottom of the circular area in the center of the rain district, guarded by a large enemy. || {{coords|-43908.60|-9246.53|4632.40}} |- | [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-3185|-7374|5624}} |- | [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}} |- | [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}} |- | [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}} |- | [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}} |- | [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}} |- | [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}} |- | rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}} | Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}} |- | After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}} |- | After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}} |} == Notes == {{notelist|refs= {{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}} }} == External links == * [[wikipedia:Homunculus|Homunculus on Wikipedia]] 2efb98edd57d3825546ee94ec694118ad28bd346 1408 1407 2025-09-05T22:59:13Z Sharparam 284703 /* List of homunculi */ Fix coords for deluge wikitext text/x-wiki '''Homunculi''' in {{BFF}} exist as objects in the world and [[items]] the player can use. == Overview == The homunculi found in the world are used to teleport between locations, and can also be rested at to recover resources and respawn [[enemies]]. The player can also use the [[Homunculus Mirage]] item to spawn their own homunculus in a location of their choosing (with some restrictions). == List of homunculi == {| class="wikitable" ! [[Locations|Location]] !! Description !! Coordinates |- | [[Monastery#Lower|Monastery (Lower)]] || Located on the side of the long roof. In [[New Game Plus]], [[The Handler]] will be standing nearby. || {{coords|22057.55|-89678.87|-15425.86}} |- | [[Monastery#Upper|Monastery (Upper)]] || Located just outside the monastery at the top of the area, near [[Konrad the Traitor|Konrad the Traitor's]] boss arena. || {{coords|15413.84|-43467.14|-811.55}} |- | [[Blok 6147]] || Located in the center of the circular structures, [[The Handler]] can be found next to it. || {{coords|0|0|1156.54}} |- | [[Rain District#Sewers|Rain District (Sewers)]] || Located up the ladder after entering the area from [[Blok 6147]]. || {{coords|-42295.56|-401.90|5081.55}} |- | [[Rain District#Center|Rain District (Center)]] || Located at the bottom of the circular area in the center of the rain district, guarded by a large enemy. || {{coords|-43908.60|-9246.53|4632.40}} |- | [[Deluge]] || Located at the top of the shaft lined with stairs after entering the area, [[The Handler]] can be found sitting on a ledge nearby. || {{coords|-31838.95|-7372.77|56246.61}} |- | [[Ghost Town#Floor 13|Ghost Town (Floor 13)]] || After exiting the elevator, walk down the path and the homunculus will be in an opening on the left. || {{coords|1129|-9050|2199}} |- | [[Ghost Town#Floor 1|Ghost Town (Floor 1)]] || After taking the elevator down from the Floor 13 area, the homunculus will be straight ahead. [[The Handler]] can be found standing to the side of the nearby doorway. || {{coords|1057|-8281|164}} |- | [[Machinarium]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead to the left. || {{coords|-2578.36|25970.67|-12004.39}} |- | [[Desert]] || Located straight ahead after entering the area, [[The Handler]] can be found just ahead below a torch. || {{coords|-9387.86|64791.21|-136368.03}} |- | [[Desert Mirage]] || Located straight ahead after entering the teleportation orb. || {{coords|278493.06|-61587.78|-119471.95}} |- | [[Anomaly]] || Located on the right after entering the area. [[The Handler]] is standing just ahead, in front of some pillars. || {{coords|47122.91|160919.88|-142106.30}} |- | [[Vermillion Fields#Plaza|Vermillion Fields (Plaza)]] || Located in the center of the circular structure, mirroring its location in [[Blok 6147]]. || {{coords|517|-5000|1170}} |- | rowspan="3" | [[Vermillion Fields#Temple|Vermillion Fields (Temple)]]{{note|name=temple}} | Located in a cave after leaving the Plaza area. || {{coords|-26|-5352|2725}} |- | After operating a lever in the building on the cliffs, keep going through the area. Eventually you will reach a big circular room and notice a Homunculus in the middle of a bridge. This is the same "Temple" Homunculus as before, but operating the lever has moved it upwards. || {{coords|-58.7|-5351|8264}} |- | After operating the second lever near where the second bald knight is after the second homunculus position, the homunculus moves to its final position at the top of the tower. || {{coords|-26.9|-5351|1685}} |} == Notes == {{notelist|refs= {{note|name=temple|The homunculus in Vermillion Fields temple moves between the three locations by operating levers.}} }} == External links == * [[wikipedia:Homunculus|Homunculus on Wikipedia]] 0e2758460591d215f96693c44a7b739690d877a4 Fisherman 0 541 1409 1360 2025-09-05T23:01:45Z Sharparam 284703 Update file name wikitext text/x-wiki {{Infobox/Enemy | image = Fisherman (enemy).png }} The '''{{PAGENAME}}''' is an enemy in {{BFF}} that appears in the [[Deluge]] location. == Drops == * [[Diver's Lungs Concoction]] * [[Fractal Fungus]] * [[Gingko Leaves]] * [[Lesser Anomalous Crystal]] * [[Lesser Restorative Fluid]] * [[Ring of Burning Desire]] * [[Sludge]] * [[Upgrade Splinter]] {{Navbox/Enemies}} [[Category:Enemies]] 340515047d434a0a2434986ea2eb1da64a489a07 File:Fisherman (enemy).png 6 880 1410 2025-09-05T23:01:59Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Template:Navbox/Enemies 10 538 1411 837 2025-09-06T00:08:51Z Sharparam 284703 Update link to dreadguard wikitext text/x-wiki {{Navbox | template = Navbox/Enemies | title = [[Enemies]] | list1 = * [[Berserking Citizen]] * [[Citizen]] * [[Construction Golem]] * [[Deranged]] * [[Dreadguard (enemy)|Dreadguard]] * [[Fisherman]] * [[Lancer]] * [[Mechanomad Technomancer]] * [[Mechanomad Warrior]] * [[Minotaur]] * [[Mrgud]] * [[Osteoclast]] * [[Plagued]] * [[Revenant]] * [[Vermillion Knight]] * [[Zealot]] | group2 = [[Bosses]] | list2 = {{Navbox/Bosses|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> b7758d62938e5072d921bfb6c881b9a69f5dc578 1412 1411 2025-09-06T08:48:37Z Sharparam 284703 Add abomination wikitext text/x-wiki {{Navbox | template = Navbox/Enemies | title = [[Enemies]] | list1 = * [[Abomination]] * [[Berserking Citizen]] * [[Citizen]] * [[Construction Golem]] * [[Deranged]] * [[Dreadguard (enemy)|Dreadguard]] * [[Fisherman]] * [[Lancer]] * [[Mechanomad Technomancer]] * [[Mechanomad Warrior]] * [[Minotaur]] * [[Mrgud]] * [[Osteoclast]] * [[Plagued]] * [[Revenant]] * [[Vermillion Knight]] * [[Zealot]] | group2 = [[Bosses]] | list2 = {{Navbox/Bosses|child}} }}<noinclude>[[Category:Navigation templates]]</noinclude> 2111a990c62fc85b80024f26e04c5aafc8d21f85 Abomination 0 881 1413 2025-09-06T08:51:30Z Sharparam 284703 Created page with "{{Pages that need coordinates}} {{Infobox/Enemy | image = Abomination (enemy).png }} '''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there. == Location == Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]]. {{Navbox/Enemies}}" wikitext text/x-wiki {{Pages that need coordinates}} {{Infobox/Enemy | image = Abomination (enemy).png }} '''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there. == Location == Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]]. {{Navbox/Enemies}} eca98563a99742bf17d0499802df635df0c589db 1427 1413 2025-09-07T17:57:57Z Sharparam 284703 Fix template call wikitext text/x-wiki {{Needs coordinates}} {{Infobox/Enemy | image = Abomination (enemy).png }} '''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there. == Location == Located in [[Rain District#Central|Rain District (Central)]], in front of the [[Homunculus]]. {{Navbox/Enemies}} 6c47197790f0aecd1d5b29e470be36243ed42d87 File:Abomination (enemy).png 6 882 1414 2025-09-06T08:51:43Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Template:Needs coordinates 10 883 1415 2025-09-07T17:28:19Z Sharparam 284703 Created page with "<includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = One or more elements on this page needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs coordinates|nocat=ye..." wikitext text/x-wiki <includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = One or more elements on this page needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs coordinates|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> b983beee1e33d2e1a5676378bfc7042a0a72b6a7 1418 1415 2025-09-07T17:33:27Z Sharparam 284703 Add what parameter to control text wikitext text/x-wiki <includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = {{{what|One or more elements on this page}}} needs [[coordinates]] added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit the page] to add them with the {{tl|Coordinates}} template. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages that need coordinates]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs coordinates|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> cd5b93a986e9899ea43605ac650a5420850b98b6 MOS 0 884 1416 2025-09-07T17:29:14Z Sharparam 284703 Redirected page to [[Meta:Manual of Style]] wikitext text/x-wiki #REDIRECT [[Meta:Manual of Style]] 918040eed385668d250445cc55d1b1824e0ed37a Category:Pages that need coordinates 14 699 1417 1067 2025-09-07T17:31:23Z Sharparam 284703 Add note on using proper template for categorizing pages wikitext text/x-wiki Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template. Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually. a8904508baed1e19bc4399a714110d838cf285a5 1420 1417 2025-09-07T17:34:48Z Sharparam 284703 Add category wikitext text/x-wiki Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template. Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually. [[Category:Pages in need of improvement]] 111fe578f77b5257e45747743c25fb4cbe8d00b7 1421 1420 2025-09-07T17:38:00Z Sharparam 284703 Change category wikitext text/x-wiki Pages that are missing coordinates to help players locate them. Either add coordinates to a "Location" or "Acquisition" section, or to an infobox, as appropriate. Coordinates can be specified by using the {{tl|Coordinates}} template. Pages should be added to this category by using the {{tl|Needs coordinates}} template, rather than putting the category on the pages manually. [[Category:Wiki maintenance]] 061ef35ecfd26a1eab8d9a455ee38633cfe0d8be Royal Division Captain Yulia & Vermillion Mirage 0 551 1419 863 2025-09-07T17:34:02Z Sharparam 284703 Use [[Template:Needs coordinates]] instead of manual categorization wikitext text/x-wiki {{Infobox/Boss | image = Final boss.png }} '''{{PAGENAME}}''' is the final [[Bosses|boss]] in {{BFF}}. == Overview == When starting the fight, only the [[Vermillion Mirage]] will be present, including showing only its name in the boss healthbar. After the mirage takes a certain amount of damage, [[Royal Division Captain Yulia]] will join the fight, updating the name in the boss healthbar to include both of them. Dying for any reason after Yulia joins the fight causes the player to gain 0.5% [[entropy]]. This is because the act of her joining applies a debuff to the player causing entropy gain on death. Throughout the fight, they will take turns being the active enemy, with the other one falling back to take a more passive role and using various ranged abilities on the player. Defeating the boss will immediately trigger the [[Endings|ending]] cutscene. After getting back to the title screen, the save file can be loaded again which will put the player at the same homunculus, allowing for the boss to be fought again. This makes it the only boss in the game that can be fought multiple times without having to start a new game. == Location == {{Needs coordinates|tiny=yes|what=This section}} Found at the end of [[Vermillion Fields]]. At the final location of the "Temple" [[Homunculus]], head up the large stairs and the boss arena will be at the top. {{Navbox/Bosses}} 3e5d852a53a95252f0e47f99dd3b7a828d0e577a Bleak Faith: Forsaken Wiki/contribute 0 7 1422 1341 2025-09-07T17:41:19Z Sharparam 284703 Add link to the maintenance category wikitext text/x-wiki {{Main page box/start | title = Contribute to the wiki }} {{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players. ; Adding content :* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done. :* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough. :* [[Special:UserLogin/signup|Register]] to edit and track your contributions. :* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki. :* Check the [[:Category:Wiki_maintenance|wiki maintenance category]] page to get an overview of things that need doing. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> c6826e10822a498bd49ec1145e2951b16d55dbc3 1423 1422 2025-09-07T17:46:15Z Sharparam 284703 Add more pointers on where to start contributing wikitext text/x-wiki {{Main page box/start | title = Contribute to the wiki }} {{SITENAME}} is a collaborative wiki resource that is open for anyone to edit. You don't need special permission beyond [[Special:UserLogin/signup|registering]] an account to edit most pages, and your contributions can grow the wiki and help other players. ; Adding content :* If you are unsure of what to do or how to create a page, search for a few articles on the same topic and see what they look like. You can always view the source code in a wiki and learn from what others have done. :* An edit doesn't have to be massive; if you feel you don't want to create whole articles, then just fixing spelling errors and broken links is enough. :* [[Special:UserLogin/signup|Register]] to edit and track your contributions. :* Read the [[Meta:Manual of Style|Manual of Style]] for guidance on how to edit the wiki. :* Check the [[:Category:Wiki_maintenance|wiki maintenance category]] page to get an overview of things that need doing. :** Particularly good starting points might be [[Special:WantedFiles|wanted files]] (or [[:Category:Pages with broken file links|pages with broken file links]]) and [[:Category:Pages that need coordinates|pages that need coordinates]]. :** [[:Category:Stubs|Stubs]] can also be a good starting point if you have enough experience to start a page mostly from scratch. {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> cfe43fa8415c0b60a53410c768631ef2c2b37c71 Template:Sfrac/styles.css 10 732 1424 1128 2025-09-07T17:56:44Z Sharparam 284703 Remove PP template call sanitized-css text/css .sfrac { white-space: nowrap; } .sfrac.tion, .sfrac .tion { display: inline-block; vertical-align: -0.5em; font-size: 85%; text-align: center; } .sfrac .num { display: block; line-height: 1em; margin: 0.0em 0.1em; border-bottom: 1px solid; } .sfrac .den { display: block; line-height: 1em; margin: 0.1em 0.1em; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); /* removed from CSS */ clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } a0e91db461b3672013e7ed2b0319f6b4d477b2dc Template:Fraction/styles.css 10 728 1425 1120 2025-09-07T17:57:01Z Sharparam 284703 Remove PP template call sanitized-css text/css .frac { white-space: nowrap; } .frac .num, .frac .den { font-size: 80%; line-height: 0; /* we want this inline */ vertical-align: super; } .frac .den { vertical-align: sub; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } d5811eb299db8c77a35b1dd2d75de323ee127834 Template:Hlist/styles.css 10 827 1426 1284 2025-09-07T17:57:24Z Sharparam 284703 Remove template call sanitized-css text/css /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } ad2cb29b8df8d60f4deeb6a5e29187e1003123fe Inhabitants 0 381 1428 525 2025-09-07T17:58:49Z Sharparam 284703 Change to needs coords template wikitext text/x-wiki {{stub}} {{Needs coordinates}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 5266cbc4ddad8e8707d2b5b4cd643e481e2f1f72 Saracen Shield 0 749 1429 1159 2025-09-07T18:00:04Z Sharparam 284703 Fix typo wikitext text/x-wiki {{Infobox/Shield | title = {{PAGENAME}} | image = Saracen Shield.png | Weight = Heavy | Abilities = [[Regal Radiance]] | Mk2_Sharp = 59.5 | Mk2_Blunt = 57.4 | Mk2_Technomancy = 69.3 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == Location == {{coords|3760|1142|-1395}} Found in the [[Desert]]. In the area with Yaroslav's crew, look behind the big statue head to find the shield. {{Navbox/Shields}} accf00596a02d4d71fbdbcf43a7cc9ed880910e8 Abilities 0 580 1430 921 2025-09-07T18:04:10Z Sharparam 284703 Add see also link to passives wikitext text/x-wiki '''Abilities''' are special skills that can be found on some [[weapons]]. == See also == * [[Passives]] {{Navbox/Abilities}} [[Category:Abilities]] 4a9afbbbbb6640ed8fad199b73590526aad4ff15 Category:Passives 14 885 1431 2025-09-07T18:05:38Z Sharparam 284703 Created page with "[[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template." wikitext text/x-wiki [[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template. 34e87bb01c1a0356708b43ee7f6ba248fda0fa61 1434 1431 2025-09-07T18:06:55Z Sharparam 284703 Add category wikitext text/x-wiki [[Passives]] in {{BFF}}. Add pages to this category by using the {{tl|Infobox/Passive}} template. [[Category:Game mechanics]] f93dc3294b2ea001157045b5b59704e1b259500d Passives 0 886 1432 2025-09-07T18:06:02Z Sharparam 284703 Created page with "'''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]]. == See also == * [[Abilities]] [[Category:Passives]]" wikitext text/x-wiki '''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]]. == See also == * [[Abilities]] [[Category:Passives]] 43331e952831989ee9513121b46b294a9fdab4b1 Category:Abilities 14 581 1433 922 2025-09-07T18:06:35Z Sharparam 284703 Add category wikitext text/x-wiki [[Abilities]] in {{BFF}}. [[Category:Game mechanics]] 50df23fadba08e57b44187e5b8ecbaf6a021eb07 Category:Disambiguation templates 14 887 1435 2025-09-07T18:07:25Z Sharparam 284703 Created blank page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Category:Hatnote modules 14 888 1436 2025-09-07T18:07:43Z Sharparam 284703 Created blank page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 1451 1436 2025-09-07T18:15:43Z Sharparam 284703 Add category wikitext text/x-wiki [[Category:Modules]] c61dcaccacae29ec6d400192885e53b0ab04ae8b Category:Disambiguation and redirection hatnote templates 14 889 1437 2025-09-07T18:07:54Z Sharparam 284703 Created blank page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Category:Anomalous crystals 14 890 1438 2025-09-07T18:08:25Z Sharparam 284703 Created page with "[[Anomalous crystals]] in {{BFF}}. [[Category:Items]]" wikitext text/x-wiki [[Anomalous crystals]] in {{BFF}}. [[Category:Items]] 4de216d6a91d096fba8022567690bb1b72711c3a Template:Abbr/doc 10 533 1439 827 2025-09-07T18:09:35Z Sharparam 284703 Add category wikitext text/x-wiki == Examples == === [[Template:Tooltip]] === * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> &rarr; {{Tooltip|text|tooltip title}} * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> &rarr; {{Tooltip|text "with" quotes|tooltip "with" quotes}} <noinclude>[[Category:Template documentation]]</noinclude> 2fc823013e38886fd1c58d0df6749119b66a263c 1448 1439 2025-09-07T18:12:40Z Sharparam 284703 Add category for template wikitext text/x-wiki == Examples == === [[Template:Tooltip]] === * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text|tooltip title}}</syntaxhighlight> &rarr; {{Tooltip|text|tooltip title}} * <syntaxhighlight lang="wikitext" inline>{{Tooltip|text "with" quotes|tooltip "with" quotes}}</syntaxhighlight> &rarr; {{Tooltip|text "with" quotes|tooltip "with" quotes}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> db627ffbedf7c1dc68f985bdca7bd31252f30c52 Template:About/doc 10 735 1440 1132 2025-09-07T18:09:50Z Sharparam 284703 Add category wikitext text/x-wiki <!-- Categories go where indicated at the bottom of this page, please. --> {{Tl|About}} is a commonly used [[wikipedia:WP:Hatnote|hatnote template]] for linking the reader to other articles with similar titles or concepts that they may have been seeking instead. ==Usage== This template should be [[wikipedia:WP:HATNOTEPLACE|placed]] at the top of an article (but following {{Tlx|Short description}}, if present). The template has several formats, including: *{{Tlx|About}} → {{About}} *{{Tlx|About|Use1}} → {{About|Use1}} *{{Tlx|About|<nowiki/>|Use2|Article2}} → {{About||Use2|Article2}} *{{Tlx|About|<nowiki/>|<nowiki/>||Article (disambiguation)}} → {{About|||Article (disambiguation)}} *{{Tlx|About|Use1|<nowiki/>|Article2}} → {{About|Use1||Article2}} *{{Tlx|About|Use1|<nowiki/>|Article2|and|Article3}} → {{About|Use1||Article2|and|Article3}} *{{Tlx|About|Use1|Use2|Article2}} → {{About|Use1|Use2|Article2}} *{{Tlx|About|Use1|Use2|Article2|and|Article3}} → {{About|Use1|Use2|Article2|and|Article3}} *{{Tlx|About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} → {{About|Use1|Use2|Article2|and|Article3|and|Article4|and|Article5}} *{{Tlx|About|Use1|Use2|Article2|Use3|Article3}} → {{About|Use1|Use2|Article2|Use3|Article3}} *{{Tlx|About|Use1|Use2|Article2|other uses}} → {{About|Use1|Use2|Article2|other uses}} The template {{tl|For-multi}} produces the same hatnote, but without the initial ''This template is about''. === Styling in italics === Please see [[wikipedia:Wikipedia:Hatnote#Hatnotes with italics in the links]] ([[wikipedia:WP:ITHAT]]) for details about how to use italics in hatnotes. ==Parameters== Alternately, a {{para|section|yes}} parameter can be added to the {{Tl|About}} template for use at the top of a section. When using this parameter, the wording in the template changes to specify that it is being used in a section: *{{Tlx|About|Use1|<nowiki>section=yes</nowiki>}} → {{About|Use1|section=yes}} *{{Tlx|About|Use1|<nowiki/>|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1||Article2|section=yes}} *{{Tlx|About|Use1|Use2|Article2|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|section=yes}} *{{Tlx|About|Use1|Use2|Article2|and|Article3|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|and|Article3|section=yes}} *{{Tlx|About|Use1|Use2|Article2|other uses|<nowiki>section=yes</nowiki>}} → {{About|Use1|Use2|Article2|other uses|section=yes}} A {{para|text}} option adds text to the end; this should only be used when truly necessary, when the other hatnote templates listed below don't suffice. The {{para|selfref|yes}} option marks the entire hatnote as a Wikipedia self-reference, causing it to be omitted when the page content is reused outside of Wikipedia (see {{tl|self reference}} and [[wikipedia:MOS:SELFREF]] for more details). For more options, see section "TemplateData" below. ==TemplateData== <!--{{TemplateData header}}--> <!-- Should this mention the existence of "and"? It's something of a can of worms, since it only looks as though it only works in certain combinations of the other page 2/3/4 description fields... --> <templatedata> { "description": "This template is a hatnote in the format \"This page is about … For other uses …\".", "params": { "1": { "label": "Page description", "type": "string", "description": "What the page this template is placed on is about (\"This page is about …\")", "suggested": true }, "2": { "label": "Other page 1 description", "type": "string", "description": "What the first other page is about. If unused or blank, defaults to \"other uses\".", "suggested": true }, "3": { "label": "Other page 1 title", "type": "wiki-page-name", "description": "The title of the first other page. If unused, defaults to \"[page title] (disambiguation)\".", "suggested": true }, "4": { "label": "Other page 2 description", "type": "string", "description": "What the second other page is about." }, "5": { "label": "Other page 2 title", "type": "wiki-page-name", "description": "The title of the second other page. If unused or blank and parameter 4 exists, defaults to \"[page title] (disambiguation)\"." }, "6": { "label": "Other page 3 description", "type": "string", "description": "What the third other page is about." }, "7": { "label": "Other page 3 title", "type": "wiki-page-name", "description": "The title of the third other page. If unused or blank and parameter 6 exists, defaults to \"[page title] (disambiguation)\"." }, "8": { "label": "Other page 4 description", "type": "string", "description": "What the fourth other page is about." }, "9": { "label": "Other page 4 title", "type": "wiki-page-name", "description": "The title of the fourth other page. If unused or blank and parameter 8 exists, defaults to \"[page title] (disambiguation)\"." }, "section": { "type": "string", "description": "Pass \"yes\" in this parameter to get wording appropriate for use at the top of a section.", "autovalue": "yes" }, "text": { "label": "Custom text", "type": "string", "description": "Text to be appended to the end." } } } </templatedata> ==See also== * [[wikipedia:Wikipedia:Hatnote]] <!--{{Hatnote templates}}--> <!-- To add more other pages, continue with this alternating pattern using increasing numbers, starting with 6 for the next page description. --> <includeonly>{{Sandbox other|| <!-- Categories go below this line, please; interwikis go to Wikidata, thank you! --> [[Category:Disambiguation and redirection hatnote templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 084e5668a358b8d298f38cdc6d3c975db7098741 Template:Average/doc 10 532 1441 825 2025-09-07T18:10:05Z Sharparam 284703 Add category wikitext text/x-wiki This template is used to find the average (default mean) of a series of numbers. ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000}} * <syntaxhighlight lang="wikitext" inline>{{Average|10|20|30|40|50|100000000|round=2}}</syntaxhighlight> → {{Average|10|20|30|40|50|100000000|round=2}} ==See also== *{{tl|Median}} <noinclude>[[Category:Template documentation]]</noinclude> 6c6e2c757468014acfc9bb1b053cff9daeccf20c Template:Coordinates/doc 10 298 1442 396 2025-09-07T18:10:18Z Sharparam 284703 Add category wikitext text/x-wiki This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12|y=50|z=-32}}</syntaxhighlight> &rarr; {{Coordinates|x=12|y=50|z=-32}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.5|42.5|-4.4}}</syntaxhighlight> &rarr; {{Coordinates|16.5|42.5|-4.4}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.2|3.4|5.6}}</syntaxhighlight> &rarr; {{coords|1.2|3.4|5.6}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.5|4.3|2.1}}</syntaxhighlight> &rarr; {{pos|6.5|4.3|2.1}} <noinclude>[[Category:Template documentation]]</noinclude> 3e8e36f5e300ca38a3ca2e6ff14c9848b28d92df Template:DamageRange/doc 10 528 1443 817 2025-09-07T18:10:34Z Sharparam 284703 Add category wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{DamageRange|10|20}}</syntaxhighlight> &rarr; {{DamageRange|10|20}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|1|2}}</syntaxhighlight> &rarr; {{DamageRange|1|2}} * <syntaxhighlight lang="wikitext" inline>{{DamageRange|69|75|type=sharp}}</syntaxhighlight> &rarr; {{DamageRange|69|75|type=sharp}} <noinclude>[[Category:Template documentation]]</noinclude> cc8abbd175ebb12283ae191c68cfb6102179c2ff Template:Duration/doc 10 789 1444 1228 2025-09-07T18:10:45Z Sharparam 284703 Add category wikitext text/x-wiki == Examples == * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30}}</syntaxhighlight> &rarr; {{Duration|3:30}} * <syntaxhighlight lang="wikitext" inline>{{Duration|h=1|m=2|s=3}}</syntaxhighlight> &rarr; {{Duration|h=1|m=2|s=3}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3|2|1}}</syntaxhighlight> &rarr; {{Duration|3|2|1}} * <syntaxhighlight lang="wikitext" inline>{{Duration|3:30:00|display=A really long time!}}</syntaxhighlight> &rarr; {{Duration|3:30:00|display=A really long time!}} * <syntaxhighlight lang="wikitext" inline>{{Duration|PT3H30M12S}}</syntaxhighlight> &rarr; {{Duration|PT3H30M12S}} <noinclude>[[Category:Template documentation]]</noinclude> 202a9e40d32b298ce8bf8d682749cbb07096af28 Template:Median/doc 10 706 1445 1079 2025-09-07T18:10:56Z Sharparam 284703 Add category wikitext text/x-wiki This template is used to find the median of a series of numbers. {{clear}} ==Parameters== Parameters with a number as the value are the numbers to find the average of. ==Examples== *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|40|50|1000}}</syntaxhighlight> → {{Median|20|10|30|40|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10|20|30|50|1000}}</syntaxhighlight> → {{Median|20|10|30|50|1000}} *<syntaxhighlight lang="wikitext" inline>{{Median|10.1|20.1|30.1|50.1|1000.1}}</syntaxhighlight> → {{Median|20.1|10.1|30.1|50.1|1000.1}} ==See also== *{{tl|Average}} <noinclude>[[Category:Template documentation]]</noinclude> b212143490662c8a089de324dc4b661ca0a56849 Template:Sandbox other/doc 10 306 1446 400 2025-09-07T18:11:10Z Sharparam 284703 Add category wikitext text/x-wiki <!-- {{Documentation subpage}} --> <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> <templatedata> { "description": { "en": "This template displays different output on sandbox and documentation pages than other ones." }, "params": { "1": { "label": { "en": "Sandbox text" }, "description": { "en": "Text displayed on sandbox (/sandbox) and documentation (/doc) subpages. Usually this doesn’t contain categories, but it may contain a link to the main template." }, "type": "content", "suggested": true }, "2": { "label": { "en": "Normal text" }, "description": { "en": "Text displayed everywhere except for sandbox and documentation subpages. Usually this contains categories for the template." }, "type": "content", "suggested": true } } } </templatedata> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 81b917070057eb1ad6e4b9f09f8d69a41a5c9e57 Template:Yesno/doc 10 307 1447 401 2025-09-07T18:11:24Z Sharparam 284703 Add category wikitext text/x-wiki <!-- {{Documentation subpage}} --> <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> This template normalises an input to be a yes/no output. == Usage == The template has five possible outputs depending on the default parameter (input if you will). In its simplest usage, these will all be either "yes" or "" (blank = nothing no characters). * {{Tlx|Yesno|yes}} → "yes" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no}} → "" (also applies to "No", "NO", "nO", "N", "n" and "0") * {{Tlx|Yesno}} → "" * {{Tlx|Yesno|¬}} → "" * {{Tlx|Yesno|purplemonkeydishwasher}} → "yes" (also applies to any other value not given above) Each of these can be over-ridden. * {{Tlx|Yesno|yes|yes{{=}}bacon}} → "{{Yesno|yes|yes=bacon}}" (also applies to "Yes", "YeS", etc, "Y", "y" and "1") * {{Tlx|Yesno|no|no{{=}}ham}} → "{{Yesno|no|no=ham}}" (also applies to "No", "NO", "nO", "N", "n" and "0") * {{Tlx|Yesno||blank{{=}}eggs}} → "{{Yesno||blank=eggs}}" ** but {{Tlx|Yesno||no{{=}}ham}} → "{{Yesno||no=ham}}" ** and {{Tlx|Yesno||blank{{=}}eggs|no{{=}}ham}} → "{{Yesno||blank=eggs|no=ham}}" * {{Tlx|Yesno|¬|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬|¬=sausage|blank=eggs|no=ham}}" ** and {{Tlx|Yesno|¬{{=}}sausage|blank{{=}}eggs|no{{=}}ham}} → "{{Yesno|¬=sausage|blank=eggs|no=ham}}" * {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}} → "{{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea}}" (also applies to any other value not given above) ** but {{Tlx|Yesno|purplemonkeydishwasher|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|yes=bacon}}" ** and {{Tlx|Yesno|purplemonkeydishwasher|def{{=}}cup-of-tea|yes{{=}}bacon}} → "{{Yesno|purplemonkeydishwasher|def=cup-of-tea|yes=bacon}}" This may be used (apparently perversely) thus: * {{Tlx|Yesno|yes|yes{{=}}no|no{{=}}yes}} → "{{Yesno|yes|yes=no|no=yes}}" * {{Tlx|Yesno|no|yes{{=}}no|no{{=}}yes}} → "{{Yesno|no|yes=no|no=yes}}" This creates a logical inversion. == TemplateData == <!-- {{TemplateData header}} --> <templatedata> { "description": { "en": "This template normalises an input to be a yes or nil output." }, "format": "inline", "params": { "1": { "label": { "en": "Input value" }, "description": { "en": "The value to be evaluated." }, "type": "string", "required": true }, "yes": { "label": { "en": "Output on yes" }, "description": { "en": "Specifies the output of the template when the input value is a case-insensitive forms of 'Yes', 'Y', 'True' or '1'." }, "type": "string", "required": false }, "no": { "label": { "en": "Output on no" }, "description": { "en": "Specifies the output of the template when the input value is a case-insensitive forms of 'No', 'N', 'False', or '0'." }, "type": "string", "required": false }, "blank": { "label": { "en": "Output on blank input" }, "description": { "en": "Specifies the output of the template when the input value is defined but is either empty or contains nothing but whitespace character(s)." }, "type": "string", "required": false }, "¬": { "label": { "en": "Output on ¬" }, "description": { "en": "Specifies the output of the template when the input value is either '¬' or entirely missing (undefined)." }, "type": "string", "required": false }, "def": { "label": { "en": "Definite output" }, "description": { "en": "Specifies the output of the template when the input value is defined but not a form of 'yes', 'no', '1', '0', '¬' or blank." }, "type": "string", "required": false } } } </templatedata> == See also == * [[Module:Yesno]] <includeonly>{{Sandbox other|| <!-- CATEGORIES AND INTERWIKIS HERE, THANKS --> [[Category:Utility templates]] }}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> ac958651ed9ec8ec8a0b3f0a1d3083a2fa331e28 Template:DiscordLink/doc 10 857 1449 1350 2025-09-07T18:13:30Z Sharparam 284703 Add category for template wikitext text/x-wiki == TemplateData == <templatedata> { "params": { "1": { "label": "Type", "description": "Type of link to produce, leave unspecified or empty for default type.", "example": "plain", "type": "line", "suggestedvalues": [ "default", "plain" ], "default": "default" }, "text": { "label": "Link text", "description": "Custom text to show as the link text instead of the default \"Discord\".", "example": "BFF Discord", "type": "line", "default": "Discord" }, "icon": { "label": "Show icon", "description": "Whether to show a Discord icon next to the link.", "type": "boolean", "default": "no" } }, "description": "Produces a link to the official Bleak Faith: Forsaken Discord server.", "paramOrder": [ "1", "text", "icon" ], "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{DiscordLink}}</syntaxhighlight> &rarr; {{DiscordLink}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|icon=yes}}</syntaxhighlight> &rarr; {{DiscordLink|icon=yes}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|text=BFF Discord}}</syntaxhighlight> &rarr; {{DiscordLink|text=BFF Discord}} * <syntaxhighlight lang="wikitext" inline>{{DiscordLink|plain}}</syntaxhighlight> &rarr; {{DiscordLink|plain}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 5e94bed3c879ca0c034e9fa3bba48ac0d59374d0 Category:Inline templates 14 609 1450 957 2025-09-07T18:15:08Z Sharparam 284703 Add category wikitext text/x-wiki Templates that can/should be used inline. [[Category:Templates]] eb911a83fafb6dcd7d10541fe3bf42da4395f330 Category:Perks 14 763 1452 1179 2025-09-07T18:16:12Z Sharparam 284703 Add category wikitext text/x-wiki [[Perks]] in {{BFF}}. [[Category:Game mechanics]] 8766f0725df74fea3c478872ad19ea3e2732e035 Category:Utility modules 14 315 1453 409 2025-09-07T18:16:35Z Sharparam 284703 Add category wikitext text/x-wiki Utility Lua modules. [[Category:Modules]] 2ac38f5cf7fe72c38ba0e1bbfe7c7dd31743b430 Category:Utility templates 14 308 1454 402 2025-09-07T18:16:51Z Sharparam 284703 Add category wikitext text/x-wiki Utility templates for editing. [[Category:Templates]] 429393713b4a71585e292b486e4ffcef4c87ce61 Category:Pages with inaccurate coordinates 14 349 1455 462 2025-09-07T18:17:17Z Sharparam 284703 Add category wikitext text/x-wiki Contains pages using the {{tl|Coordinates}} template or {{ml|Coordinates}} module but passing in one or more coordinates that can be verified to not be completely accurate (i.e. coordinates with fewer than 2 decimals). [[Category:Wiki maintenance]] 70ee3bdbaac740c9bb377489f9fd4e240f558a11 Category:Modules 14 698 1456 1066 2025-09-07T18:18:13Z Sharparam 284703 Add category wikitext text/x-wiki Lua modules. [[Category:Bleak Faith: Forsaken Wiki]] de766841cc4ddf8c2adbf18a442a28192377cc70 Category:File templates 14 587 1457 928 2025-09-07T18:18:54Z Sharparam 284703 Add category wikitext text/x-wiki Templates to help work with or categorise files. [[Category:Templates]] 8e1ff2f0663f9d8800e9f83d2d8c11546b2433d4 Category:Disambiguation templates 14 887 1458 1435 2025-09-07T18:19:43Z Sharparam 284703 Add category wikitext text/x-wiki [[Category:Templates]] 06eecdec29f6cb215c99cf216d1e3bdc8c30a95e Category:Manual of Style 14 846 1459 1333 2025-09-07T18:20:13Z Sharparam 284703 Add category wikitext text/x-wiki Pages that deal with how the wiki should be edited. [[Category:Bleak Faith: Forsaken Wiki]] 35577961aeea1e2857d5032bdd994c9c3a8a45b0 Category:Module documentation pages 14 316 1460 410 2025-09-07T18:21:51Z Sharparam 284703 Add category wikitext text/x-wiki Pages that document usage for Lua modules. [[Category:Modules]] 35a28ebc3e2a045dd778e124a3b89331eceaa6ad Abomination 0 881 1461 1427 2025-09-07T23:01:43Z Sharparam 284703 Add coords and fix typo wikitext text/x-wiki {{Infobox/Enemy | image = Abomination (enemy).png }} '''{{PAGENAME}}''' is a large quadrupedal enemy located in [[Rain District#Central|central Rain District]], guarding the [[Homunculus]] there. == Location == {{coords|-43256.48|-9189.85|4654.05}} (approximate) Located in [[Rain District#Center|Rain District (Center)]], in front of the [[Homunculus]]. {{Navbox/Enemies}} 17a8e1630af5b771bd3959eaaff8671fe1c9c608 Module:Coordinates/doc 828 891 1462 2025-09-07T23:07:54Z Sharparam 284703 Created page with "== Usage == Do not use the module directly, instead use the {{tl|Coordinates}} template. == Test cases == <!-- * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|}} --> === Accurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1.23|4.56|7.89}} === Inaccurate === * <syntaxhighlight lang="wikitext"..." wikitext text/x-wiki == Usage == Do not use the module directly, instead use the {{tl|Coordinates}} template. == Test cases == <!-- * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|}} --> === Accurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1.23|4.56|7.89}} === Inaccurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1|2|3}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1|2|3}} * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.0|2.0|3.0}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1.0|2.0|3.0}} <includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!-- --><noinclude>[[Category:Module documentation pages]]</noinclude> 7cb6b3be92ebb1fc3e188425e895d53a96683999 1464 1462 2025-09-07T23:14:33Z Sharparam 284703 Add link to styles wikitext text/x-wiki == Usage == Do not use the module directly, instead use the {{tl|Coordinates}} template. == Styles == * [[Module:Coordinates/styles.css]] == Test cases == <!-- * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|}} --> === Accurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1.23|4.56|7.89}} === Inaccurate === * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1|2|3}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1|2|3}} * <syntaxhighlight lang="wikitext" inline>{{#invoke:Coordinates|main|1.0|2.0|3.0}}</syntaxhighlight> &rarr; {{#invoke:Coordinates|main|1.0|2.0|3.0}} <includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!-- --><noinclude>[[Category:Module documentation pages]]</noinclude> fd213ce58882a30d859ed97c03e80ca03fa7965e Module:Coordinates/styles.css 828 892 1463 2025-09-07T23:13:43Z Sharparam 284703 Created page with ".coordinates { text-decoration: underline dotted; } .coordinates.inaccurate { text-decoration-color: red; text-decoration-style: wavy; }" sanitized-css text/css .coordinates { text-decoration: underline dotted; } .coordinates.inaccurate { text-decoration-color: red; text-decoration-style: wavy; } db96eb1801a0135aa30f3280e515af2094d423af Module:Coordinates 828 296 1465 1405 2025-09-07T23:18:39Z Sharparam 284703 Use stylesheet Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local CHECK_PATTERN = "^-?%d+%.%d%d$" local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = args.x or args[1] or "" local y = args.y or args[2] or "" local z = args.z or args[3] or "" local accurate_x = string.match(x, CHECK_PATTERN) ~= nil local accurate_y = string.match(y, CHECK_PATTERN) ~= nil local accurate_z = string.match(z, CHECK_PATTERN) ~= nil local accurate = accurate_x or accurate_y or accurate_z x = tonumber(z) or 0 y = tonumber(z) or 0 z = tonumber(z) or 0 local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z) local elem = mw.html.create('span') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) if not accurate then elem = elem:addClass('inaccurate') end elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if not accurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end local with_styles = mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Coordinates/styles.css' } } .. elem return with_styles end return p 593292e1a1dac54b90713ee4b0ef431dbbfa2c72 Template:Coordinates/doc 10 298 1466 1442 2025-09-07T23:22:19Z Sharparam 284703 Make sure examples use accurate coordinates, add example of inaccurate coords wikitext text/x-wiki This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> &rarr; {{Coordinates|x=12.42|y=50.00|z=-32.70}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> &rarr; {{Coordinates|16.51|42.55|-4.43}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{coords|1.23|4.56|7.89}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> &rarr; {{pos|6.51|4.32|2.13}} Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot: <syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> &rarr; {{coords|1|2|3}} <noinclude>[[Category:Template documentation]]</noinclude> a89bb1bedd24821a52110ebb711f71eccca244ef Diver's Lungs Concoction 0 893 1467 2025-09-07T23:28:35Z Sharparam 284703 Created page with "{{Infobox/Item | image = Diver's Lungs Concoction (item).png | type = concoction | Description = Increases maximum lung capacity by {{Duration|s=25|display=25 seconds}} worth of oxygen for {{Duration|s=300|display=300 seconds}}. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. It lets the player stay longer underwater by increasing their lung capacity. == Acquisition == Drops from [[Fisherman|fishermen]]. {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | image = Diver's Lungs Concoction (item).png | type = concoction | Description = Increases maximum lung capacity by {{Duration|s=25|display=25 seconds}} worth of oxygen for {{Duration|s=300|display=300 seconds}}. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. It lets the player stay longer underwater by increasing their lung capacity. == Acquisition == Drops from [[Fisherman|fishermen]]. {{Navbox/Consumables}} 144f3fe65f87d139bda8b687ddc4fb8c8504d2bc File:Diver's Lungs Concoction (item).png 6 894 1468 2025-09-07T23:30:13Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_51 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_51 }} == Licensing == {{License|game}} a816b0fa3540456c73cc969d2ab7d66a4dd6fc96 Asylum Brew 0 895 1469 2025-09-07T23:33:30Z Sharparam 284703 Created page with "{{Infobox/Item | image = Asylum Brew (item).png | type = consumable | Description = Reset all of your assigned perks. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Location == {{Needs coordinates|tiny=yes|what=This section}} Found near the beginning of the game in [[New Game Plus|NG+]]. {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | image = Asylum Brew (item).png | type = consumable | Description = Reset all of your assigned perks. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Location == {{Needs coordinates|tiny=yes|what=This section}} Found near the beginning of the game in [[New Game Plus|NG+]]. {{Navbox/Consumables}} caf9c60ae34d33f482c4f29382ae04e416fa872f File:Asylum Brew (item).png 6 896 1470 2025-09-07T23:34:03Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_37 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_37 }} == Licensing == {{License|game}} 24ecfc87dbf948b55ba33c7b915c6a35e7485d42 Ionization Fluid 0 897 1471 2025-09-07T23:37:12Z Sharparam 284703 Created page with "{{Infobox/Item | image = Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | image = Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}} 6ee67fb9d6d89ed7111b124b114aef624b14f278 File:Ionization Fluid (item).png 6 898 1472 2025-09-07T23:38:05Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_8 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_8 }} == Licensing == {{License|game}} 3359aa55c3123704b247968effea8c856f0e15f2 Lesser Ionization Fluid 0 899 1473 2025-09-07T23:40:20Z Sharparam 284703 Created page with "{{Infobox/Item | image = Lesser Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 100 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | image = Lesser Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 100 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Ionization Fluid]] * [[Greater Ionization Fluid]] {{Navbox/Consumables}} a00def1510294b50f411d6303801b7a5c58bbdf2 File:Lesser Ionization Fluid (item).png 6 900 1474 2025-09-07T23:40:47Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_15 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_15 }} == Licensing == {{License|game}} e95f0029f64512e2c93aa8579965a15b6f419220 Greater Ionization Fluid 0 901 1475 2025-09-07T23:42:11Z Sharparam 284703 Created page with "{{Infobox/Item | image = Greater Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Ionization Fluid]] {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | image = Greater Ionization Fluid (item).png | type = fluid | Description = Once the bloodline of the [[Imperium]], the Ionization fluid remains the most essential variable in most [[Technomancy]]. Restores 175 [[Flux]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}} used to restore [[Flux]]. == See also == * [[Lesser Ionization Fluid]] * [[Ionization Fluid]] {{Navbox/Consumables}} 67290ee299ee4f517ec4648e6dc1648dd6dcff7a File:Greater Ionization Fluid (item).png 6 902 1476 2025-09-07T23:42:37Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_3 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_3 }} == Licensing == {{License|game}} 65acf6a2babd2d5f488554363f7633670653542a Template:Infobox/Shield 10 457 1477 679 2025-09-07T23:47:29Z Sharparam 284703 Add support for min mark and title fallback wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=shield |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Weight,Passives,Abilities |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{#if:{{{Mk0_Sharp|}}}|{{{Mk0_Sharp}}}%|???}} |Mk0_Blunt={{#if:{{{Mk0_Blunt|}}}|{{{Mk0_Blunt}}}%|???}} |Mk0_Technomancy={{#if:{{{Mk0_Technomancy|}}}|{{{Mk0_Technomancy}}}%|???}} |Mk1_Sharp={{#if:{{{Mk1_Sharp|}}}|{{{Mk1_Sharp}}}%|???}} |Mk1_Blunt={{#if:{{{Mk1_Blunt|}}}|{{{Mk1_Blunt}}}%|???}} |Mk1_Technomancy={{#if:{{{Mk1_Technomancy|}}}|{{{Mk1_Technomancy}}}%|???}} |Mk2_Sharp={{#if:{{{Mk2_Sharp|}}}|{{{Mk2_Sharp}}}%|???}} |Mk2_Blunt={{#if:{{{Mk2_Blunt|}}}|{{{Mk2_Blunt}}}%|???}} |Mk2_Technomancy={{#if:{{{Mk2_Technomancy|}}}|{{{Mk2_Technomancy}}}%|???}} |Mk3_Sharp={{#if:{{{Mk3_Sharp|}}}|{{{Mk3_Sharp}}}%|???}} |Mk3_Blunt={{#if:{{{Mk3_Blunt|}}}|{{{Mk3_Blunt}}}%|???}} |Mk3_Technomancy={{#if:{{{Mk3_Technomancy|}}}|{{{Mk3_Technomancy}}}%|???}} |Mk4_Sharp={{#if:{{{Mk4_Sharp|}}}|{{{Mk4_Sharp}}}%|???}} |Mk4_Blunt={{#if:{{{Mk4_Blunt|}}}|{{{Mk4_Blunt}}}%|???}} |Mk4_Technomancy={{#if:{{{Mk4_Technomancy|}}}|{{{Mk4_Technomancy}}}%|???}} |Mk5_Sharp={{#if:{{{Mk5_Sharp|}}}|{{{Mk5_Sharp}}}%|???}} |Mk5_Blunt={{#if:{{{Mk5_Blunt|}}}|{{{Mk5_Blunt}}}%|???}} |Mk5_Technomancy={{#if:{{{Mk5_Technomancy|}}}|{{{Mk5_Technomancy}}}%|???}} }}{{#if:{{NAMESPACE}}||[[Category:Shields]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 8931d1e93b36fefa8ff5cacb37de1f62f098337b Flat Shield 0 903 1478 2025-09-07T23:48:07Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Shield | title = {{PAGENAME}} | image = Flat Shield.png | Weight = Heavy | Mk_min = 1 | Mk1_Sharp = 61.7 | Mk1_Blunt = 58.5 | Mk1_Technomancy = 39 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Shield | title = {{PAGENAME}} | image = Flat Shield.png | Weight = Heavy | Mk_min = 1 | Mk1_Sharp = 61.7 | Mk1_Blunt = 58.5 | Mk1_Technomancy = 39 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}} 940a44e19c55c0458ac6add23e0b2691944c7f1f File:Flat Shield.png 6 904 1479 2025-09-07T23:49:29Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_KiteshieldFlat }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_KiteshieldFlat }} == Licensing == {{License|game}} 3e580546301203f92f639bfac3e05acb6b3cb182 Template:Needs location 10 905 1480 2025-09-07T23:51:25Z Sharparam 284703 Created page with "<includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = {{{what|This page}}} needs a location section added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to add one. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages missing location]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs location|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude>" wikitext text/x-wiki <includeonly>{{Ambox | color = gold | icon = Cleanup.svg | message = {{{what|This page}}} needs a location section added. You can [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit it] to add one. | tiny = {{{tiny|}}} | class = {{{class|}}} | date = {{{date|}}} }}<!-- -->{{Main other|{{Yesno|{{{nocat|}}}|no=[[Category:Pages missing location]]}}}}<!-- --></includeonly><!-- --><noinclude>{{Needs location|nocat=yes}} {{doc|Template:Ambox/doc}}</noinclude> 562974d484e01f92cfa7c30ccf742dc32a1aaf5e Category:Pages missing location 14 906 1481 2025-09-07T23:52:39Z Sharparam 284703 Created page with "Pages in this category are missing location information for where they can be obtained or are located. To put a page in this category, use the {{tl|Needs location}} template. [[Category:Wiki maintenance]]" wikitext text/x-wiki Pages in this category are missing location information for where they can be obtained or are located. To put a page in this category, use the {{tl|Needs location}} template. [[Category:Wiki maintenance]] 5eac526e708aab4f90b14769338f0958466bed6f Kite Shield 0 907 1482 2025-09-07T23:54:13Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Shield | image = Kite Shield.png | Weight = Heavy | Mk_min = 0 | Mk0_Sharp = 51 | Mk0_Blunt = 51 | Mk0_Technomancy = 30 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Shield | image = Kite Shield.png | Weight = Heavy | Mk_min = 0 | Mk0_Sharp = 51 | Mk0_Blunt = 51 | Mk0_Technomancy = 30 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. {{Navbox/Shields}} c0d3267e89401628212c8046a21053f517afa77e File:Kite Shield.png 6 908 1483 2025-09-07T23:55:47Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/KiteShieldIcon }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/KiteShieldIcon }} == Licensing == {{License|game}} d7a68d97c4061fd014bdfd9b8381fbffc3e7e854 Military Shield 0 909 1484 2025-09-07T23:56:59Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Shield | image = Military Shield.png | Weight = Heavy | Abilities = Shield Bash | Mk_min = 2 | Mk0_Sharp = 66.5 | Mk0_Blunt = 59.5 | Mk0_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == See also == * [[Tall Military Shield]] {{Navbox/Shields}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Shield | image = Military Shield.png | Weight = Heavy | Abilities = Shield Bash | Mk_min = 2 | Mk0_Sharp = 66.5 | Mk0_Blunt = 59.5 | Mk0_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == See also == * [[Tall Military Shield]] {{Navbox/Shields}} 2bd0947b343b32db4e42502c0f90481467b96564 1486 1484 2025-09-07T23:58:00Z Sharparam 284703 Fix stats wikitext text/x-wiki {{Needs location}} {{Infobox/Shield | image = Military Shield.png | Weight = Heavy | Abilities = Shield Bash | Mk_min = 2 | Mk2_Sharp = 66.5 | Mk2_Blunt = 59.5 | Mk2_Technomancy = 52.5 }} '''{{PAGENAME}}''' is a [[Shields|shield]] in {{BFF}}. == See also == * [[Tall Military Shield]] {{Navbox/Shields}} ea347b44b98dffeb9aeaeed7791d1b25fa21de12 File:Military Shield.png 6 910 1485 2025-09-07T23:57:44Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_militaryshield }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_militaryshield }} == Licensing == {{License|game}} 06a72fbf6338f7d8b747ffca7ca91e957da3af9c The Handler 0 345 1487 458 2025-09-08T00:06:11Z Sharparam 284703 /* Locations */ Add rain district location and fix deluge coords wikitext text/x-wiki {{Infobox/NPC | image = The Handler Blok 6147.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}} that will let the player upgrade their [[equipment]], embed crystals into it, and manufacture certain [[items]]. == Overview == Other than serving as a way to upgrade and manufacture items, she will also give the player some guidance on their next objective. She will usually appear next to the [[Homunculus]] closest to the entrance of an area. The Handler's synchronization level can be increased by finding [[Handler Echo|handler echoes]] and bringing them to her. Increasing her level allows for upgrading [[equipment]] to higher levels. == Appearance == She appears to be some sort of robot or cyborg, with light skin, black parts, and silver hair. == Locations == {| class="wikitable" ! scope="col" | Area ! scope="col" | Description ! scope="col" | Coordinates |- | [[Monastery]] || Near the first [[Homunculus]] (only in [[New Game Plus]]) || {{coords|23473.78|-85243.22|-15260.61}} |- | [[Blok 6147]] || In the center (right next to the [[Homunculus]]) || {{coords|-25.27|442.48|1160.96}} |- | [[Rain District]] || In the center area, in front of a wall to the left of the [[Homunculus]] || {{coords|-43084.52|-8483.92|4575.76}} |- | [[Deluge]] || Sitting on a ledge near the first [[Homunculus]] || {{coords|-33118.94|-7478.60|56507.07}} |- | [[Asylum]] || Standing in front of a pillar near the [[Homunculus]] || {{coords|-4507|6967|9032}} |- | [[Upper Blocks]] || Standing in front of some rubble opposite of the [[Homunculus]] || {{coords|4585|1626|2193}} |- | [[Machinarium]] || Standing next to a wall just past the first [[Homunculus]] || {{coords|-2125.53|27029.25|-12156.72}} |- | [[Desert]] || Standing next to a wall just past the [[Homunculus]] || {{coords|-9576.35|65589.26|-136382.62}} |- | [[Anomaly]] || Standing next to a pair of pillars just past the [[Homunculus]] || {{coords|46782.80|162169.12|-141987.55}} |- | [[Vermillion Fields]] || Standing next to the [[Homunculus]], mirroring her location in [[Blok 6147]] || {{coords|582|-4995|1178}} |} == Quotes == === When approached === When approached without any special event dialogue waiting to be triggered, she will pick one of the below greeting phrases at random. {{Quote|Hello!|audio=The_Handler_Hello.ogg}} {{Quote|Hello there!|audio=The_Handler_Hello_There.ogg}} {{Quote|Well hello there!|audio=The_Handler_Well_Hello_There.ogg}} {{Quote|Back so soon!|audio=The_Handler_Back_So_Soon.ogg}} {{Quote|Look who came to visit!|audio=The_Handler_Look_Who_Came_To_Visit.ogg}} === First encounter === {{Quote |You're finally here. We can now commence the [[recalibration]]. I've updated the locations of the malfunctioning modules in the terminal. Any time you link to a terminal, you should be able to see the modules. I must advise utmost caution, as I have surveyed the area and it is infested with aggressive mutations. The radiation leaking out of [[The Anomaly|the anomaly]] is causing a strong disturbance in the casual field. We should leave this place as soon as possible. The readings are unlike anything I've seen. The data is completely unstable as I am still unable to upload it for decyphering. Farewell. | audio = The_Handler_First_Encounter.ogg }} === After first [[recalibration]] === {{Quote |There is one module left to recalibrate. Unfortunately the data leaking from [[The Anomaly|the anomaly]] is still too corrupted to read. The surveillance net has taken note of ripples with particularly long wavelengths unusually coming into existence. I believe it's a sign of intruders – particularly dangerous ones that are not of our timeline. I am not sure I understand what exactly is going on here. I suppose we are yet to learn the true definition of something anomalous. Farewell. }} === After second [[recalibration]] === {{Quote |The [[recalibration]] was successful, the transgression field is down. [[The Anomaly|The anomaly]] is now exposed and ready to be stabilized. ''*silence*'' I'm afraid I will be breaching protocol by telling you, that since the recalibration – I have been unable to transmit or receive any transmissions from any other floor. If I had to make a guess, I would say something from inside the anomaly is tampering with much more than just the causal field. I am afraid I am not equipped to run a robust field analysis, but I speculate we're dealing with an event far outside our scope. Nevertheless, I did run some more rudimentary data decrypting processes. The leaks from inside the anomaly are not arbitrary, they reveal the patterns of language. I have tried to compute at least the general scope and nature of its form – but the permutations are overwhelming all of my systems. Simply running the processes has had some kind of spillover effect into the computing instruments themselves. This language is of unfathomable complexity. Take great caution, these are circumstances far outside the realms of understanding. Farewell. }} === First encounter in [[Vermillion Fields]] === {{Quote |Good to see a familiar face. I must admit, I am no more aware of what is really taking place than I was before this turn of events. I believe there is a powerful external force moving the needle here, and we are completely oblivious to its nature. I am afraid I won't be of much more use to you in this state, and I'm not quite sure how I've even made it this far. However, I will help with what I can, while I'm here. I did however learn something. While being transported I noticed a certain Vermillion branching structure buffering this entire world and its roots run deeply. My access was promptly restricted, leaving me in this condition. Whatever effect the Vermillion structure has, we must be very careful. I believe it has access to base reality, in which case we are dealing with a potential cataclysmic event. I don't know if it is fear, or excitement – whatever we are experiencing here makes me feel in a way I find hard to describe. Stay safe. }} Her lines in [[Vermillion Fields]] are delivered in a distorted voice, she will also no longer greet the player when approached. Despite her claims about not being of much use any more, she can still perform all of her normal functions. == Gallery == <gallery> File:The_Handler_Blok_6147.png|[[The Handler]] in [[Blok 6147]].|alt=Screenshot showing The Handler standing around in Blok 6147. File:The_Handler_Deluge.png|[[The Handler]] in [[Deluge]].|alt=Screenshot showing The Handler sitting on a ledge in Deluge. File:The_Handler_Asylum.png|[[The Handler]] in [[Asylum]].|alt=Screenshot showing The Handler standing around in Asylum. File:The_Handler_Upper_Blocks.png|[[The Handler]] in [[Upper Blocks]].|alt=Screenshot showing The Handler standing around in Upper Blocks. File:The_Handler_Machinarium.png|[[The Handler]] in [[Machinarium]].|alt=Screenshot showing The Handler standing around in Machinarium. </gallery> == Trivia == * The game files call her "Blacksmith". {{Navbox/NPCs}} 965ad67ead98e0fcf8f1148bcc9ebcd6d6521fd1 Aberrant Knight 0 911 1488 2025-09-08T00:14:45Z Sharparam 284703 Created page with "{{Infobox/Boss | image = Aberrant Knight (boss).png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. It is the boss of the [[Machinarium]] area. == Location == {{coords|39381.14|55587.16|-18311.03}} (approximate) Located in [[Machinarium]], being the boss of the area. {{Navbox/Bosses}}" wikitext text/x-wiki {{Infobox/Boss | image = Aberrant Knight (boss).png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. It is the boss of the [[Machinarium]] area. == Location == {{coords|39381.14|55587.16|-18311.03}} (approximate) Located in [[Machinarium]], being the boss of the area. {{Navbox/Bosses}} af411180d56b06fed6914bae2971476fecf3e2e5 File:Aberrant Knight (boss).png 6 912 1489 2025-09-08T00:16:50Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Archinquisitor Belisarius (boss) 0 548 1490 857 2025-09-08T00:19:39Z Sharparam 284703 /* Location */ Fix coords wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[NPC]]|Archinquisitor Belisarius}} {{Infobox/Boss | title = Archinquisitor Belisarius | image = Archinquisitor Belisarius (boss).png }} '''Archinquisitor Belisarius''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Location == {{coords|43321.24|172994.22|-141305.92}} (approximate) Found at the beginning of the [[Anomaly]] area. == Drops == * [[Blessed Crosier]] * [[Unstable Perk Essence]] * [[Upgrade Module]] == Quotes == === Upon engaging him === {{Quote |Well well… You made it through. As much as I hate to elevate your spiteful existence to the height of the truth… this is where we are now. Ever since you've joined us, all you've done is fulfil the goals of the disgusting administration you work for. The mundane pursuit of tasks is all you know… and this crusade against that apostate filth at the gate is just a backdrop to your performance. Yet [[Anomaly|the anomaly]] is a blessing I will not let slip out of my hands… for it is instrumental in aiding the God-Emperor, noble is he and eternal, to finally transcend. Nothing will stand in that path, I assure you. Not the Serdars, not [[Yaroslav]] and definitely not you – a dog that obeys by reflex instead of will. Now… we both know you never quite die – so you'll at least find out what an eternity of pain is made of. Good thing you have no name – those make for the best martyrs. }} {{Navbox/Bosses}} e324f6e2cfa6156cde4dbbdba8680171b6731c92 File:Archinquisitor Belisarius (boss).png 6 913 1491 2025-09-08T00:22:22Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Unknown (boss) 0 549 1492 859 2025-09-08T00:25:03Z Sharparam 284703 /* Location */ Add needs coords template wikitext text/x-wiki {{About|the [[Bosses|boss]]|the [[Locations|location]]|Unknown (location)}} {{Infobox/Boss | title = Unknown | image = Unknown (boss).png }} '''Unknown''' is an optional [[Bosses|boss]] in {{BFF}}. == Overview == The Unknown resembles the player character in [[armor]], but uses its own [[Weapons|weapon]] instead of mirroring the player's. It does not drop its weapon on defeat. Upon defeating the boss, the player is immediately transported to [[Vermillion Fields]]. == Location == {{Needs coordinates|tiny=yes|what=This section}} Located at the end of the [[Unknown (location)|Unknown]], being the boss of the area. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 3219be45353be22732ceff0032f590f17d890194 Wormlord 0 547 1493 855 2025-09-08T00:26:13Z Sharparam 284703 /* Overview */ Fix link to anomaly location wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Wormlord.png }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Overview == Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]]. == Location == {{coords|2550|-4122|-1198}} (approximate) Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 4b5591aa710c93ff63f75d58cb7d44090009328e Unknown (location) 0 365 1494 493 2025-09-08T00:26:56Z Sharparam 284703 Add list of enemies wikitext text/x-wiki {{About|the [[Locations|location]]|the [[Bosses|boss]]|Unknown (boss)}} '''Unknown''' is a [[Locations|location]] in {{BFF}}. == Overview == As the Unknown cannot be relocated to, it has no artwork image and no in-game description. == Enemies == === Bosses === * [[Unknown (boss)|Unknown]] {{Navbox/Locations}} [[Category:Locations]] 13647554bab09dde78a155ac84cd933be9f5feff Vermillion Fields 0 364 1495 491 2025-09-08T00:27:56Z Sharparam 284703 Add enemies (boss) wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Overview == Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]]. == Plaza == [[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]] {{Quote |Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field. }} {{clear}} == Temple == [[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]] {{Quote |Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes. }} == Enemies == === Bosses === * [[Royal Division Captain Yulia & Vermillion Mirage|Royal Division Captain Yulia & Vermillion Mirage]] {{Navbox/Locations}} [[Category:Locations]] 24bf1b906760314271b205275768a748565b8e01 Monastery 0 354 1496 471 2025-09-08T00:28:55Z Sharparam 284703 Add boss list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Lower == [[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]] {{Quote | A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings }} {{clear}} == Upper == [[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]] {{Quote | Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos. }} == Enemies == === Bosses === * [[Mutated Ghoul]] (lower) * [[Konrad the Traitor]] (upper) {{Navbox/Locations}} [[Category:Locations]] 2c119d74a88242088576696b386938aa671855a5 Blok 6147 0 353 1497 469 2025-09-08T00:29:55Z Sharparam 284703 Add boss list wikitext text/x-wiki [[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history. }} == Enemies == === Bosses === * [[Plagued Warden]] == Trivia == * If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list. {{Navbox/Locations}} [[Category:Locations]] b77bf137ab1141557621b152b4583a87b136d923 Asylum 0 357 1498 1329 2025-09-08T00:30:58Z Sharparam 284703 /* Bosses */ Rename to enemies and change bosses to sub heading wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} == NPCs == * [[Inquisitor Commander Alexius]] == Enemies == === Bosses === * [[Plagued Nemesis]] {{Navbox/Locations}} [[Category:Locations]] b79b7f8b2e2ab31389b0eb2dee59c73d3eec0b12 Upper Blocks 0 358 1499 479 2025-09-08T00:31:26Z Sharparam 284703 Add boss list wikitext text/x-wiki [[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation. }} == Enemies == === Bosses === * [[Silicon Visage]] {{Navbox/Locations}} [[Category:Locations]] f2f110321314817e0dbe67c7cb95cec9fe076739 Uranopolis 0 352 1500 948 2025-09-08T00:31:57Z Sharparam 284703 Add boss list wikitext text/x-wiki '''Uranopolis''' is a location in {{BFF}}. == Sub-locations == Uranopolis consists of two sub-locations: Tower Complex and Lone Tower. === Tower Complex === {{Main|Uranopolis/Tower Complex}} [[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]] The '''Tower Complex''' is the first sub-location encountered by the player. {{clear}} === Lone Tower === [[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]] The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here. == Enemies == === Bosses === * [[Nurgei the Blademaster]] {{Navbox/Locations}} [[Category:Locations]] 2af5e75e3cf86d833de500601626d60f0fc38943 Ghost Town 0 359 1501 481 2025-09-08T00:32:40Z Sharparam 284703 Add boss list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}} == Floor 1 == [[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]] {{Quote | A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog. }} == Enemies == === Bosses === * [[Plagued Revenant]] {{Navbox/Locations}} [[Category:Locations]] 5ded3be01d5c890d56c5f36dde075a16f128cf42 Machinarium 0 360 1502 483 2025-09-08T00:33:08Z Sharparam 284703 Add boss list wikitext text/x-wiki [[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay. }} == Enemies == === Bosses === * [[Aberrant Knight]] {{Navbox/Locations}} [[Category:Locations]] 83aa77c8adbe31c38597cc50a1853a01dfc7d52f 1514 1502 2025-09-08T00:39:15Z Sharparam 284703 Add NPC list wikitext text/x-wiki [[File:Machinarium.png|thumb|Machinarium as depicted in the game's relocation menu.|alt=Artwork showing an area in the Machinarium: A short walkway leading to a small building. In the background can be seen taller structures with bridges between them.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Rusted machinery and oil-slicked floors are interspersed with tarnished religious relics, like ancient statues and faded icons, which add a somber contrast yet subtly complement the mechanical decay. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Aberrant Knight]] {{Navbox/Locations}} [[Category:Locations]] 3e8ed7220931056a7827e0269b79919161dce1e9 Desert Mirage 0 362 1503 487 2025-09-08T00:33:42Z Sharparam 284703 Add boss list wikitext text/x-wiki [[File:Desert Mirage.png|thumb|Desert Mirage as depicted in the game's relocation menu.|alt=Artwork showing the desert mirage. The entrance building can be seen on the left, with several towers in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A desert from another time. }} == Enemies == === Bosses === * [[Wormlord]] {{Navbox/Locations}} [[Category:Locations]] 5651f67a3a0f29bf3cb713db423047e0819aaa59 Vermillion Fields 0 364 1504 1495 2025-09-08T00:34:23Z Sharparam 284703 Add NPC list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Overview == Upon reaching '''Vermillion Fields''', all previous [[locations]] become inaccessible and are no longer shown in the relocation menu of the [[Homunculus|homunculi]]. == Plaza == [[File:Vermillion Fields (Plaza).png|thumb|The Vermillion Fields plaza as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields plaza, an outdoors scene with red foliage and the circular center structure seen on the left.]] {{Quote |Forms standing out sharply against the striking vermillion landscape. A sea of fiery hues stretch endlessly. A familiar structure looms over the field. }} {{clear}} == Temple == [[File:Vermillion Fields (Temple).png|thumb|The Vermillion Fields temple as depicted in the game's relocation menu.|alt=Artwork showing the Vermillion Fields temple.]] {{Quote |Perched atop the [[Vermillion Fields|vermillion fields]], the monastery rises as a monolithic, stunning structure with grand, sweeping arches and intricate carvings. Its imposing presence is both serene and majestic, standing out against the vibrant landscape with a timeless, ethereal beauty. A poetry in shapes. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Royal Division Captain Yulia & Vermillion Mirage|Royal Division Captain Yulia & Vermillion Mirage]] {{Navbox/Locations}} [[Category:Locations]] fd241b3246aafa857d9911c0abd5f8ea11d3e5a5 Monastery 0 354 1505 1496 2025-09-08T00:35:42Z Sharparam 284703 Add NPC list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Lower == [[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]] {{Quote | A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings }} {{clear}} == Upper == [[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]] {{Quote | Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos. }} == NPCs == * [[The Handler]] ([[New Game Plus|NG+]]) == Enemies == === Bosses === * [[Mutated Ghoul]] (lower) * [[Konrad the Traitor]] (upper) {{Navbox/Locations}} [[Category:Locations]] 8a0c9a1365d42e5a9e116242723dc1678af12588 1506 1505 2025-09-08T00:36:04Z Sharparam 284703 /* NPCs */ Add abandoned soldier wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Lower == [[File:Monastery (Lower).png|thumb|The lower monastery as depicted in the game's relocation menu.|alt=Artwork showing the long bridge in the lower Monastery where the player starts.]] {{Quote | A rusted, skeletal bridge precariously connects two towering structures high above a chaotic maze of crumbling buildings }} {{clear}} == Upper == [[File:Monastery (Upper).png|thumb|The upper monastery as depicted in the game's relocation menu.|alt=Artwork showing a scene from the upper monastery. The actual monastery building where the area's boss is can be seen in the background.]] {{Quote | Perched atop a jagged cliff, the ancient monastery, with its weathered stone walls and moss-covered spires. Serene isolation amidst the surrounding chaos. }} == NPCs == * [[Abandoned Soldier]] * [[The Handler]] ([[New Game Plus|NG+]]) == Enemies == === Bosses === * [[Mutated Ghoul]] (lower) * [[Konrad the Traitor]] (upper) {{Navbox/Locations}} [[Category:Locations]] 4f82add3f2b01b58e03c8b0b33f82a3bee36db60 Blok 6147 0 353 1507 1497 2025-09-08T00:36:43Z Sharparam 284703 Add NPC list wikitext text/x-wiki [[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Plagued Warden]] == Trivia == * If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list. {{Navbox/Locations}} [[Category:Locations]] fdfc9be0ef1ff569131403b669f0f8a3dacda60c 1516 1507 2025-09-08T00:40:01Z Sharparam 284703 /* Enemies */ Add Mrgud to enemies wikitext text/x-wiki [[File:Blok 6147.png|thumb|Blok 6147 as depicted in the game's relocation menu.|alt=Artwork showing the central area in Blok 6147.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A vast ringed and radial expanse of intricate concrete architecture, adorned with grand archways, ornate carvings, and timeworn {{sic|hide=y|expected=time-worn}} structures that narrate centuries of rich history. }} == NPCs == * [[The Handler]] == Enemies == * [[Mrgud]] === Bosses === * [[Plagued Warden]] == Trivia == * If the game is saved while in Blok 6147, the location listed on the save file will be "Blok 6174". This is presumably a typo as the location is referred to as Blok 6147 in both the pause menu and [[Homunculus]] relocation list. {{Navbox/Locations}} [[Category:Locations]] f55783066b7d0960a9ee313da31dea7ab64fd1f9 Rain District 0 355 1508 473 2025-09-08T00:37:03Z Sharparam 284703 Add NPC list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Sewers == [[File:Rain District (Sewers).png|thumb|The rain district sewers as depicted in the game's relocation menu.|alt=Artwork showing the sewers in the rain district.]] {{Quote | A maze of flooded tunnels with murky water that echoes the constant patter of rain from above, walls slick with moss and grime, and a stench of decay that ingles with the distant roar of rushing water and the occasional scurrying of unseen creatures. }} {{clear}} == Center == [[File:Rain District (Center).png|thumb|The rain district center as depicted in the game's relocation menu.|alt=Artwork showing the center room in the rain district.]] {{Quote | A residential area lying in perpetual rain. Its dilapidated buildings stand silent and forlorn, windows shattered, rooftops caved in, walls rotting with mold. The relentless downpour }} == NPCs == * [[The Handler]] {{Navbox/Locations}} [[Category:Locations]] 3e8f6f71cd2e707bcc1f0c9f0085caf6646ecbe4 Deluge 0 356 1509 475 2025-09-08T00:37:22Z Sharparam 284703 Add NPC list wikitext text/x-wiki [[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} == NPCs == * [[The Handler]] {{Navbox/Locations}} [[Category:Locations]] 84a22cc9c4203bbad070d834c63d1920578d596c Asylum 0 357 1510 1498 2025-09-08T00:37:38Z Sharparam 284703 /* NPCs */ Add handler wikitext text/x-wiki [[File:Asylum.png|thumb|The asylum as depicted in the game's relocation menu.|alt=Artwork showing the buildings of the asylum.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | The asylum looms ominously with its towering spires and weathered stone walls. Narrow, iron-barred windows peering out like hollow eyes. Dim interiors where shadows dance along cold, damp corridors echoing with the whispers of long-forgotten souls. }} == NPCs == * [[The Handler]] * [[Inquisitor Commander Alexius]] == Enemies == === Bosses === * [[Plagued Nemesis]] {{Navbox/Locations}} [[Category:Locations]] ec100e3106294481f735b21d155821c4ad934b97 Upper Blocks 0 358 1511 1499 2025-09-08T00:38:00Z Sharparam 284703 Add NPC list wikitext text/x-wiki [[File:Upper Blocks.png|thumb|Upper Blocks as depicted in the game's relocation menu.|alt=Artwork showing the tall buildings that make up the upper blocks.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | The abandoned residential and industrial sector is silent, with decaying buildings and rusting machinery shrouded in a heavy layer of dust and cobwebs. Overgrown vines and weeds cling to the crumbling facades, while the occasional gust of wind stirs the remnants of a once-bustling area, now frozen in time and isolation. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Silicon Visage]] {{Navbox/Locations}} [[Category:Locations]] ecdd4ff8e21d9d90d6abfd5d13a922968c39d7fb Uranopolis 0 352 1512 1500 2025-09-08T00:38:25Z Sharparam 284703 Add NPC list wikitext text/x-wiki '''Uranopolis''' is a location in {{BFF}}. == Sub-locations == Uranopolis consists of two sub-locations: Tower Complex and Lone Tower. === Tower Complex === {{Main|Uranopolis/Tower Complex}} [[File:Uranopolis (Tower Complex).png|thumb|The tower complex as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Tower Complex area.]] The '''Tower Complex''' is the first sub-location encountered by the player. {{clear}} === Lone Tower === [[File:Uranopolis (Lone Tower).png|thumb|The lone tower as depicted in the game's relocation menu.|alt=Artwork showing towers and walkways from Uranopolis' Lone Tower area. The towers housing the area's boss as well as the recalibration "eye" can be seen.]] The '''Lone Tower''' is the second sub-location encountered by the player. The area's boss – [[Nurgei the Blademaster]] – can be found here. == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Nurgei the Blademaster]] {{Navbox/Locations}} [[Category:Locations]] 43d298324f3588187322a2d7b665431749820817 Ghost Town 0 359 1513 1501 2025-09-08T00:38:58Z Sharparam 284703 Add NPC list wikitext text/x-wiki '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. == Floor 13 == [[File:Ghost Town (Floor 13).png|thumb|The 13th floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing a view down a tall shaft in Ghost Town, stairs lining the walls.]] {{Quote | Crumbling, dilapidated buildings shrouded in mist. Faded, peeling paint reveals dark stains on the decaying facades – the area is haunted by the whispers of its forgotten past. }} {{clear}} == Floor 1 == [[File:Ghost Town (Floor 1).png|thumb|The 1st floor of Ghost Town as depicted in the game's relocation menu.|alt=Artwork showing an outside scene in Ghost Town depicting several high-rise residential buildings.]] {{Quote | A decrepit graveyard sprawls with uneven, weather-beaten tombstones. Sunken graves, choked with tangled weeds. Rusted tracks stretch out into the darkness, and the empty ticket counters and derelict waiting rooms are cloaked in fog. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Plagued Revenant]] {{Navbox/Locations}} [[Category:Locations]] b83bfb21d2791b19b31b04aee2cf572681057141 Desert 0 361 1515 485 2025-09-08T00:39:32Z Sharparam 284703 Add NPC list wikitext text/x-wiki [[File:Desert.png|thumb|Desert as depicted in the game's relocation menu.|alt=Artwork showing the large palace in the desert. The labyrinth can be seen in the background.]] '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | A dark desert stretches endlessly at the foot of the towering city. Harsh winds whip through the desolate landscape, sending wisps of sand swirling around skeletal remains of old structures. The oppressive silence is occasionally broken by the distant echo of the city's hum. }} == NPCs == * [[The Handler]] {{Navbox/Locations}} [[Category:Locations]] ad73e08b17c1c5fda6c74f15478053d32d80cd8e Bosses 0 539 1517 867 2025-09-08T00:48:09Z Sharparam 284703 Add overview wikitext text/x-wiki '''{{PAGENAME}}''' are powerful, unique [[enemies]] that do not respawn and typically grant bigger rewards when defeated. == Overview == There are four mandatory bosses in the game that must be defeated in order to reach an [[Endings|ending]]: * [[Nurgei the Blademaster]] (to access one of the two [[Recalibration|recalibrations]]) * [[Wormlord]] (to access the [[Anomaly]]) * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] (to access the labyrinth in the anomaly) * [[Royal Division Captain Yulia & Vermillion Mirage]] (the final boss, required to end the game) If going for the [[Endings#Skull Knight|Skull Knight ending]], defeating [[Unknown (boss)|Unknown]] is required. All other bosses are optional, although it is recommended to kill at least [[Konrad the Traitor]] to get access to the [[Homunculus Mirage]]. {{Navbox/Bosses}} [[Category:Bosses]] 4a384386aedf4eb9640b778902d511953b6b61ae Blacksmith 0 914 1518 2025-09-08T01:00:13Z Sharparam 284703 Redirected page to [[The Handler]] wikitext text/x-wiki #REDIRECT [[The Handler]] 88b800514a0b691d707ee19ba584e637d3655f46 Anomaly (location) 0 363 1519 1361 2025-09-08T01:02:00Z Sharparam 284703 Add gallery wikitext text/x-wiki [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] == Gallery == <gallery> File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line. </gallery> {{Navbox/Locations}} [[Category:Locations]] 3d87ec3fa38d389e039733d0f695e0ee5f9b9be2 File:Labyrinth solution.jpg 6 915 1520 2025-09-08T01:02:20Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Module:Recipe 828 916 1521 2025-09-08T15:18:08Z Sharparam 284703 Created page with "local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end lo..." Scribunto text/plain local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end local function parse_ingredients(args) local ingredients = {} for k, v in pairs(args) do local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN) if ing_index then ing_index = tonumber(ing_index) or 1 if not ingredients[ing_index] then ingredients[ing_index] = { count = 1 } end local ingredient = ingredients[ing_index] if ing_prop == "" then ingredient.name = v if not ingredient.display then ingredient.display = v end elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then ingredient.count = tonumber(v) or 1 elseif ing_prop == "display" then ingredient.display = v end end end return ingredients end local function parse_type(args) if not args['type'] then return 'crafting' end local i_type = string.lower(tostring(args['type'])) if string.match(i_type, '^manufactur') then return 'manufacturing' end return 'crafting' end local function make_quantity(quantity) return html.create('td') :addClass('quantity') :wikitext(quantity or 1) end local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local result = parse_result(args) local ingredients = parse_ingredients(args) local r_type = parse_type(args) local ingredient_count = #ingredients local result_cell = html.create('td') :attr('rowspan', ingredient_count) :wikitext(string.format("[[%s|%s]]", result.name, result.display)) local type_link if r_type == "crafting" then type_link = "[[Crafting]]" else type_link = "[[Manufacturing]]" end local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link) local firstRow = html.create('tr') local rows = { firstRow } for i, ingredient in ipairs(ingredients) do local td = html.create('td') :wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display)) if i == 1 then firstRow:node(td) firstRow:node(make_quantity(ingredient.count)) else local row = html.create('tr') :node(td) :node(make_quantity(ingredient.count)) rows[#rows + 1] = row end end firstRow:node(result_cell):node(type_cell) local tbody = html.create('tbody') for _, row in ipairs(rows) do tbody:node(row) end local tbl = html.create('table') :addClass('wikitable') :tag('thead') :tag('tr') :tag('th'):attr('colspan', 2):wikitext('Ingredients'):done() :tag('th'):attr('colspan', 2):wikitext('Result'):done() :tag('th'):attr('rowspan', 2):wikitext('Type'):done() :done() :tag('tr') :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :done() :done() :node(tbody) return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Recipe/styles.css' } } .. tostring(tbl) end return p d8042b98696516ad4aa6cbf1e30271f5ac6201cc 1524 1521 2025-09-08T15:25:02Z Sharparam 284703 Fix result count not added Scribunto text/plain local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end local function parse_ingredients(args) local ingredients = {} for k, v in pairs(args) do local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN) if ing_index then ing_index = tonumber(ing_index) or 1 if not ingredients[ing_index] then ingredients[ing_index] = { count = 1 } end local ingredient = ingredients[ing_index] if ing_prop == "" then ingredient.name = v if not ingredient.display then ingredient.display = v end elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then ingredient.count = tonumber(v) or 1 elseif ing_prop == "display" then ingredient.display = v end end end return ingredients end local function parse_type(args) if not args['type'] then return 'crafting' end local i_type = string.lower(tostring(args['type'])) if string.match(i_type, '^manufactur') then return 'manufacturing' end return 'crafting' end local function make_quantity(quantity) return html.create('td') :addClass('quantity') :wikitext(quantity or 1) end local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local result = parse_result(args) local ingredients = parse_ingredients(args) local r_type = parse_type(args) local ingredient_count = #ingredients local result_cell = html.create('td') :attr('rowspan', ingredient_count) :wikitext(string.format("[[%s|%s]]", result.name, result.display)) local type_link if r_type == "crafting" then type_link = "[[Crafting]]" else type_link = "[[Manufacturing]]" end local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link) local firstRow = html.create('tr') local rows = { firstRow } for i, ingredient in ipairs(ingredients) do local td = html.create('td') :wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display)) if i == 1 then firstRow:node(td) firstRow:node(make_quantity(ingredient.count)) else local row = html.create('tr') :node(td) :node(make_quantity(ingredient.count)) rows[#rows + 1] = row end end firstRow :node(result_cell) :node(make_quantity(result.count)) :node(type_cell) local tbody = html.create('tbody') for _, row in ipairs(rows) do tbody:node(row) end local tbl = html.create('table') :addClass('wikitable') :tag('thead') :tag('tr') :tag('th'):attr('colspan', 2):wikitext('Ingredients'):done() :tag('th'):attr('colspan', 2):wikitext('Result'):done() :tag('th'):attr('rowspan', 2):wikitext('Type'):done() :done() :tag('tr') :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :done() :done() :node(tbody) return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Recipe/styles.css' } } .. tostring(tbl) end return p 1c851a25897c5e7ae8af3beb0f33a19712254570 1525 1524 2025-09-08T15:26:45Z Sharparam 284703 Fix result count not having rowspan and missing class on table Scribunto text/plain local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end local function parse_ingredients(args) local ingredients = {} for k, v in pairs(args) do local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN) if ing_index then ing_index = tonumber(ing_index) or 1 if not ingredients[ing_index] then ingredients[ing_index] = { count = 1 } end local ingredient = ingredients[ing_index] if ing_prop == "" then ingredient.name = v if not ingredient.display then ingredient.display = v end elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then ingredient.count = tonumber(v) or 1 elseif ing_prop == "display" then ingredient.display = v end end end return ingredients end local function parse_type(args) if not args['type'] then return 'crafting' end local i_type = string.lower(tostring(args['type'])) if string.match(i_type, '^manufactur') then return 'manufacturing' end return 'crafting' end local function make_quantity(quantity) return html.create('td') :addClass('quantity') :wikitext(quantity or 1) end local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local result = parse_result(args) local ingredients = parse_ingredients(args) local r_type = parse_type(args) local ingredient_count = #ingredients local result_cell = html.create('td') :attr('rowspan', ingredient_count) :wikitext(string.format("[[%s|%s]]", result.name, result.display)) local type_link if r_type == "crafting" then type_link = "[[Crafting]]" else type_link = "[[Manufacturing]]" end local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link) local firstRow = html.create('tr') local rows = { firstRow } for i, ingredient in ipairs(ingredients) do local td = html.create('td') :wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display)) if i == 1 then firstRow:node(td) firstRow:node(make_quantity(ingredient.count)) else local row = html.create('tr') :node(td) :node(make_quantity(ingredient.count)) rows[#rows + 1] = row end end firstRow :node(result_cell) :node(make_quantity(result.count):attr('rowspan', ingredient_count)) :node(type_cell) local tbody = html.create('tbody') for _, row in ipairs(rows) do tbody:node(row) end local tbl = html.create('table') :addClass('wikitable') :addClass('recipe') :tag('thead') :tag('tr') :tag('th'):attr('colspan', 2):wikitext('Ingredients'):done() :tag('th'):attr('colspan', 2):wikitext('Result'):done() :tag('th'):attr('rowspan', 2):wikitext('Type'):done() :done() :tag('tr') :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :tag('th'):wikitext('Item'):done() :tag('th'):tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done():done() :done() :done() :node(tbody) return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Recipe/styles.css' } } .. tostring(tbl) end return p 004e67f47f4debd731fd681e73e5fdbca53f0b5d 1527 1525 2025-09-08T15:33:15Z Sharparam 284703 Make table construction more readable Scribunto text/plain local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end local function parse_ingredients(args) local ingredients = {} for k, v in pairs(args) do local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN) if ing_index then ing_index = tonumber(ing_index) or 1 if not ingredients[ing_index] then ingredients[ing_index] = { count = 1 } end local ingredient = ingredients[ing_index] if ing_prop == "" then ingredient.name = v if not ingredient.display then ingredient.display = v end elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then ingredient.count = tonumber(v) or 1 elseif ing_prop == "display" then ingredient.display = v end end end return ingredients end local function parse_type(args) if not args['type'] then return 'crafting' end local i_type = string.lower(tostring(args['type'])) if string.match(i_type, '^manufactur') then return 'manufacturing' end return 'crafting' end local function make_quantity(quantity) return html.create('td') :addClass('quantity') :wikitext(quantity or 1) end local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local result = parse_result(args) local ingredients = parse_ingredients(args) local r_type = parse_type(args) local ingredient_count = #ingredients local result_cell = html.create('td') :attr('rowspan', ingredient_count) :wikitext(string.format("[[%s|%s]]", result.name, result.display)) local type_link if r_type == "crafting" then type_link = "[[Crafting]]" else type_link = "[[Manufacturing]]" end local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link) local firstRow = html.create('tr') local rows = { firstRow } for i, ingredient in ipairs(ingredients) do local td = html.create('td') :wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display)) if i == 1 then firstRow:node(td) firstRow:node(make_quantity(ingredient.count)) else local row = html.create('tr') :node(td) :node(make_quantity(ingredient.count)) rows[#rows + 1] = row end end firstRow :node(result_cell) :node(make_quantity(result.count):attr('rowspan', ingredient_count)) :node(type_cell) local tbody = html.create('tbody') for _, row in ipairs(rows) do tbody:node(row) end local thead = html.create('thead') :tag('tr') :tag('th'):attr('colspan', 2):wikitext('Ingredients'):done() :tag('th'):attr('colspan', 2):wikitext('Result'):done() :tag('th'):attr('rowspan', 2):wikitext('Type'):done() :done() :tag('tr') :tag('th'):wikitext('Item'):done() :tag('th') :tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done() :done() :tag('th'):wikitext('Item'):done() :tag('th') :tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done() :done() :allDone() local tbl = html.create('table') :addClass('wikitable') :addClass('recipe') :node(thead) :node(tbody) return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Recipe/styles.css' } } .. tostring(tbl) end return p a728b87a48a6e8450149103101c31566087d1935 1528 1527 2025-09-08T15:41:29Z Sharparam 284703 Fix weird table render bug Scribunto text/plain local html = mw.html local getArgs = require('Module:Arguments').getArgs local INGREDIENT_KEY_PATTERN = '^ingredient(%d*)_?(%w*)' local function parse_result(args) local result = { name = args['result'], count = tonumber(args['result_count'] or args['result_amount'] or args['result_quantity'] or args['result_qty']) or 1 } if args['result_display'] then result.display = args['result_display'] else result.display = result.name end return result end local function parse_ingredients(args) local ingredients = {} for k, v in pairs(args) do local ing_index, ing_prop = string.match(k, INGREDIENT_KEY_PATTERN) if ing_index then ing_index = tonumber(ing_index) or 1 if not ingredients[ing_index] then ingredients[ing_index] = { count = 1 } end local ingredient = ingredients[ing_index] if ing_prop == "" then ingredient.name = v if not ingredient.display then ingredient.display = v end elseif ing_prop == "count" or ing_prop == "amount" or ing_prop == "quantity" or ing_prop == "qty" then ingredient.count = tonumber(v) or 1 elseif ing_prop == "display" then ingredient.display = v end end end return ingredients end local function parse_type(args) if not args['type'] then return 'crafting' end local i_type = string.lower(tostring(args['type'])) if string.match(i_type, '^manufactur') then return 'manufacturing' end return 'crafting' end local function make_quantity(quantity) return html.create('td') :addClass('quantity') :wikitext(quantity or 1) end local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local result = parse_result(args) local ingredients = parse_ingredients(args) local r_type = parse_type(args) local ingredient_count = #ingredients local result_cell = html.create('td') :attr('rowspan', ingredient_count) :wikitext(string.format("[[%s|%s]]", result.name, result.display)) local type_link if r_type == "crafting" then type_link = "[[Crafting]]" else type_link = "[[Manufacturing]]" end local type_cell = html.create('td'):attr('rowspan', ingredient_count):wikitext(type_link) local firstRow = html.create('tr') local rows = { firstRow } for i, ingredient in ipairs(ingredients) do local td = html.create('td') :wikitext(string.format("[[%s|%s]]", ingredient.name, ingredient.display)) if i == 1 then firstRow:node(td) firstRow:node(make_quantity(ingredient.count)) else local row = html.create('tr') :node(td) :node(make_quantity(ingredient.count)) rows[#rows + 1] = row end end firstRow :node(result_cell) :node(make_quantity(result.count):attr('rowspan', ingredient_count)) :node(type_cell) local tbl = html.create('table') :addClass('wikitable') :addClass('recipe') :tag('tr') :tag('th'):attr('colspan', 2):wikitext('Ingredients'):done() :tag('th'):attr('colspan', 2):wikitext('Result'):done() :tag('th'):attr('rowspan', 2):wikitext('Type'):done() :done() :tag('tr') :tag('th'):wikitext('Item'):done() :tag('th') :tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done() :done() :tag('th'):wikitext('Item'):done() :tag('th') :tag('abbr'):attr('title', 'Quantity'):wikitext('Qty'):done() :done() :done() for _, row in ipairs(rows) do tbl:node(row) end return mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Recipe/styles.css' } } .. tostring(tbl) end return p 65eb71beee89a329f11e0315759e7fa99d0ae2d2 Module:Recipe/doc 828 917 1522 2025-09-08T15:22:16Z Sharparam 284703 Created page with "This module should not be used directly, instead use it via the {{tl|Recipe}} template. == Styles == * [[Module:Recipe/styles.css]] == Test cases == === Simple single ingredient recipe === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} </syntaxhighlight> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|ma..." wikitext text/x-wiki This module should not be used directly, instead use it via the {{tl|Recipe}} template. == Styles == * [[Module:Recipe/styles.css]] == Test cases == === Simple single ingredient recipe === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} </syntaxhighlight> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Big Item |ingredient1 = Small Item |ingredient2 = Medium Item }} </syntaxhighlight> {{#invoke:Recipe|main |result = Big Item |ingredient1 = Small Item |ingredient2 = Medium Item }} <includeonly>{{Sandbox other||[[Category:Module]]}}</includeonly><!-- --><noinclude>[[Category:Module documentation pages]]</noinclude> 924dabd9b5ce88588b5468b5e3a7e93320fff6df 1526 1522 2025-09-08T15:30:04Z Sharparam 284703 Fix category wikitext text/x-wiki This module should not be used directly, instead use it via the {{tl|Recipe}} template. == Styles == * [[Module:Recipe/styles.css]] == Test cases == === Simple single ingredient recipe === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} </syntaxhighlight> {{#invoke:Recipe|main |result = Copper Ingot |ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Big Item |ingredient1 = Small Item |ingredient2 = Medium Item }} </syntaxhighlight> {{#invoke:Recipe|main |result = Big Item |ingredient1 = Small Item |ingredient2 = Medium Item }} <includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!-- --><noinclude>[[Category:Module documentation pages]]</noinclude> 282fd35889589b1a3259a62fa0b2a439cf3ac551 Module:Recipe/styles.css 828 918 1523 2025-09-08T15:22:41Z Sharparam 284703 Created page with "table.recipe td.quantity { text-align: right; }" sanitized-css text/css table.recipe td.quantity { text-align: right; } 6c91e0a24445782d77a41927c93fcea5e8999f01 Template:Recipe 10 919 1529 2025-09-08T15:42:17Z Sharparam 284703 Created page with "<includeonly>{{#invoke:Recipe|main}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Recipe|main}}</includeonly><!-- --><noinclude>{{Documentation}}</noinclude> 60f7d633c7b254e0cc19de5121aa901700e7462e Template:Recipe/doc 10 920 1530 2025-09-08T15:46:24Z Sharparam 284703 Created page with "== Examples == === Simple recipe with single ingredient === <syntaxhighlight lang="wikitext"> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} </syntaxhighlight> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} </syntaxhighlight> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} ===..." wikitext text/x-wiki == Examples == === Simple recipe with single ingredient === <syntaxhighlight lang="wikitext"> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} </syntaxhighlight> {{Recipe | result = Copper Ingot | ingredient = Copper Ore }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} </syntaxhighlight> {{Recipe | result = Potion | ingredient1 = Water | ingredient2 = Flask }} === Manufacturing recipe === <syntaxhighlight lang="wikitext"> {{Recipe | result = Fancy Stone | ingredient = Regular Stone | type = manufacturing }} </syntaxhighlight> {{Recipe | result = Fancy Stone | ingredient = Regular Stone | type = manufacturing }} === Quantities === <syntaxhighlight lang="wikitext"> {{Recipe | result = Arrow | result_quantity = 10 | ingredient1 = Stone | ingredient1_quantity = 5 | ingredient2 = Wood | ingredient2_quantity = 2 | ingredient3 = Feather | ingredient3_quantity = 10 | type = crafting }} </syntaxhighlight> {{Recipe | result = Arrow | result_quantity = 10 | ingredient1 = Stone | ingredient1_quantity = 5 | ingredient2 = Wood | ingredient2_quantity = 2 | ingredient3 = Feather | ingredient3_quantity = 10 | type = crafting }} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> 9217aa42d53ccd4fcdb294788416035335932bce Hellicar's Maxims 0 379 1531 521 2025-09-12T21:28:51Z Sharparam 284703 Add contents of the documents wikitext text/x-wiki '''{{PAGENAME}}''' are [[lore]] [[documents]] that can be found in {{BFF}}. == Overview == There are 3 parts to collect in the game. {{Quote |title=1/3 |If it should happen that you fell lost, turn right at the first gate and start again. Don't hesitate. What has been will always be. What is to come was never ours. The orchid has blossomed at exactly the same spot every year, so far, but, that is no guarantee. It might not make it back this year. The skywhales might lose their way in the swaying winds – the swallows never make it back home. We do not know. And in that lies the power of all the things that might be. The map grows old instantly, getting out of the same side of the bed tiresome. The almond's blossom often comes too soon. It is just stubborn determination. The walls of the Megalopolis were not designed to fall. The Angel thought this message would for ever last. Times is not carved out in a straight line. She is like the waves and fickle as the clouds. She comes, she goes, she weaves. If lost, it might not be a gate, but turn left again at the first sign. Turn and remain on the narrow and the straight. }} {{Quote |title=2/3 |These are simply lives, with all their mechanisms and internal complexity, their mythology and their aspirations. Each flame a fire, each fire a small world as infinite as the imagination, as deep as the mesmerising sea. On the surface we are listening to the wind, the gentle ripples following on as waves, the clouds hovering with subtle menace, filled with intangible dimensions. There are few trees on the coast, struggling against the salty spray, growing with dogged determination. Their blossom is feeble. Their fruit bitter. Their leaves hard and brittle. The frost doesn't come as far as the coast. The snow is a vision and the bitter bite of the steady breeze that does feed the fire, that does reach down and nourish the soul. Simply lives within which a unique concoction of the very same days provide a million varied flavours. The ghosts are inhabitants of the past, the sky eels carry the ragged dreams of battles that are still to come. Leaves that fell from a tree, drops that left the ocean. }} {{Quote |title=3/3 |The picture is tattered, taunted and all but torn. The sun struggles to deal with this particular dawn. It is early and it is still late. The clouds have formed, the rain beats a gentle rhythm in the glistening street. Water and oil, the rainbow bled into the ground. The light came and went, the land was savagely raped and the hills were gutted so that we might have slightly better lives. Paint a scene where the kestrel still hovers. Paint a scene where we might see what we have and what had once been. }} == Acquisition == Drops from [[enemies]] in the game. * Asylum enemy with cape and sword+shield. {{Navbox/Documents}} [[Category:Lore]] [[Category:Documents]] b776e2d8e1d9c8c96e6aff603d38f0bdb6792bcc Konrad's War Log 0 921 1532 2025-09-12T21:39:23Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] that can be found in {{BFF}}. == Overview == There are 5 different logs to collect. Based on the name and contents of the final log, it can be assumed that [[Konrad the Traitor]] is the author of these logs. {{Quote |title=1/5 |The first phase is complete and the transit points have been secured. The population is cooperative, so I have ensured the men keep their calm. There is talk of some kind of co..." wikitext text/x-wiki '''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] that can be found in {{BFF}}. == Overview == There are 5 different logs to collect. Based on the name and contents of the final log, it can be assumed that [[Konrad the Traitor]] is the author of these logs. {{Quote |title=1/5 |The first phase is complete and the transit points have been secured. The population is cooperative, so I have ensured the men keep their calm. There is talk of some kind of corruption at play, but all I can make out for now is that the citizens blame each other for everything, competing to show their loyalty to our presence. Annoying. }} {{Quote |title=2/5 |We now know the location of [[The Serdars|the Serdars]]. I was hoping for a reply from [[Yaroslav]], but the first dispatch hasn't returned. I am now sending another and reattempting the completion of the second phase. We've only arrived but the locals already tire me. So does the weather, if it can even be called that – the sky and the rain feel as if they are all the exhaust material of some unbearable manufacturing zone. }} {{Quote |title=3/5 |Negotiations have failed, the second phase is now obsolete and three of our platoons have been obliterated by the Serdars. Yarsoslav has, I believe, gone mad. This was his army just as much as mine until this mess. I will never understand what leads others to betrayal… He butchered our men as if he never knew them. NOTE: I suspect [[The Administration|the Administration]] is also establishing their presence here. }} {{Quote |title=4/5 |The citizens are at moments unmanageable, at others, docile and apathetic. As for us, I can no longer afford any expeditions below since I have only a few men remaining. Two full divisions are on their way for support, since news of our debacle at the gate has spread – I am afraid it is open war with the Serdars… There will be no easy resolution to whatever's going on. If only I could have a word with Yaroslav myself, I'm sure he would see reason. }} {{Quote |title=5/5 |We were ambushed yesterday in the temple we've set up camp in – yet it feels pathetic to say by whom. A single knight, wearing the grin of death! He would pass for a clown if he hadn't told me what he had. I will retire into what's left of the monastery to reconsider everything. The state of affairs is such that I'm sure the administration will soon step in. I would wish luck if it were anyone else venturing below, but I hope they meet what they deserve at Yaroslav's gate. }} {{Navbox/Documents}} [[Category:Documents]] d27a842a52d1cf714c1c4ced79de13cb39e49d8f Helena's Diary Fragment 0 922 1533 2025-09-12T21:49:39Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 5 fragments in the game. {{Quote |title=1/5 |When they arrived, they said they were looking for a traitor and those who betrayed them… Maybe the soldiers who came before? Still, I was curious about the new one… he was taller than all the soldiers he came with. He seemed handsome and his name sounded noble… [[Konrad the Traitor|Konrad]]. His men lost their way..." wikitext text/x-wiki '''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 5 fragments in the game. {{Quote |title=1/5 |When they arrived, they said they were looking for a traitor and those who betrayed them… Maybe the soldiers who came before? Still, I was curious about the new one… he was taller than all the soldiers he came with. He seemed handsome and his name sounded noble… [[Konrad the Traitor|Konrad]]. His men lost their way when the strange knight with a face like a skull{{note|Likely the [[Skull Knight]].}} joined them in their temple… A fight broke out and all we could hear was the slaughter inside. Konrad survived and left then but something was strange. I wonder where he is. I don't even know him but I hope he's alive and well. }} {{Quote |title=2/5 |Things were becoming more chaotic and if that wasn't enough, more soldiers arrived. These were not only looking for their rebel, but they also seemed to be obsessing over the area beyond the [[Machinarium]], just like the ones Konrad was looking for. Soon, even more of them showed up and they were the exact opposite of what Konrad was like. Big bulks of metal, bald and brutal. They seemed to lose track of the time just like the rest of us though and when they lost their patience… some things are best left unsaid. }} {{Quote |title=3/5 |We were given shovels to clean the neighborhood and pile everything up… the rubble and the dead in their containers. We then moved this to a nearby site where other piles were being incinerated. As I did what I was told, I felt like I had so many narrow escapes. Every thread to my life seemed to boost my eagerness to survive. Things lose sense by the day and this confusion seems to be crippling the invaders as well. I hope we can find a way to leave soon so we can just put all of this behind us. }} {{Quote |title=4/5 |Just when I thought things couldn't get any worse, they brought their monks and scribes. Words cannot describe what's going on. One moment they completely stomp out the people from a certain building, the next, it's as if the building has been abandoned for… decades? And then later in the week, the lights in it go on. I swear I saw someone looking out at me from inside one night. }} {{Quote |title=5/5 |The person in the window waved at me again last night. Maybe it's someone they spared during the raid? My ex secretary says the days now overlap. Yesterday feels like tomorrow, and now feels like something that happened a week ago. Perhaps all the things [[Feigenbaum]] played with are finally catching up with us. The hunger however is now the only thing we worry about. }} == Notes == {{Notelist}} {{Navbox/Documents}} [[Category:Documents]] 9b300b89df13f885be3a2cb1187586cd95148ebc Guiscard's Manifest 0 923 1534 2025-09-12T21:56:18Z Sharparam 284703 Created page with "'''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 3 parts in the game. {{Quote |title=1/3 |Those surrounded by comfort wallow in excesses, disturbed only by the most accidental of anxieties until an event such as this – and once that opulence comes into jeopardy, other extremes become priorities – flight, retaining all that was accumulated on the backs of others and if necessary, the instant siding with the inv..." wikitext text/x-wiki '''{{PAGENAME}}''' is a collection of [[Documents|lore documents]] in {{BFF}}. == Overview == There are 3 parts in the game. {{Quote |title=1/3 |Those surrounded by comfort wallow in excesses, disturbed only by the most accidental of anxieties until an event such as this – and once that opulence comes into jeopardy, other extremes become priorities – flight, retaining all that was accumulated on the backs of others and if necessary, the instant siding with the invader, to keep the honey flowing. Existence at one point becomes only the pursuit of more. }} {{Quote |title=2/3 |Those however who are in general condemned to suffer, who struggle even in times that are deemed good for others, must again rely on numbness and intoxication to see through it all. These unfortunate misers, used to being accused by the previously described for everything and anything, then fall even lower, to the level of blaming each other for how things have turned out instead of the foreign enemy or their previous rulers – and when that is done, they go even lower. Where they will once again kneel and obey, for a dog may have a preference for one master over another, but his base loyalty can always be bought with the promise of mere survival. }} {{Quote |title=3/3 |To be a hunter, a whaler, an officer, or a doctor, and to remain so only to not lose one's livelihood. We should strive however for an era in which none of us have exclusive spheres of activity, where each can become accomplished in any branch one wishes, and where the polis regulates the excesses of necessity, thus making it possible to do one thing today and another tomorrow – to hunt in the morning, to sail in the afternoon, to administrate accordingly in the evening, heal and nurture after dinner, without ever having to confine one to the base rules of surviving – but to strive for a life filled with the blossoms of labor and inspiration. }} {{Navbox/Documents}} [[Category:Documents]] 3a9e9b2b4ef93abeb51e38c0a90a4dfbe0496cab Monastery Observation 0 924 1535 2025-09-12T22:01:55Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found in [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote |Standing at the top of the cliff, a derelict monastery. An anachronistic island in a sea of decaying technology. The surrounding residential structure looms oppressively, its vast expanse of concrete and rusted metal interwoven with a labyrinth of cables. Everything is draped in a strange, sickly moss. An eerie silence h..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found in [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote |Standing at the top of the cliff, a derelict monastery. An anachronistic island in a sea of decaying technology. The surrounding residential structure looms oppressively, its vast expanse of concrete and rusted metal interwoven with a labyrinth of cables. Everything is draped in a strange, sickly moss. An eerie silence hung in the air, broken only by the distant hum of [[The Megastructure|the megastructure]]. The moss, with its unsettling, almost sentient presence, clung to the remnants of the past, casting a malign shadow over this forgotten place. Each step towards the monastery feels like a descent into madness, the boundaries between the organic and the artificial blurring in the twilight of a world long caving in on itself. It's hard to tell what belongs to what time any more. The only compass here is the pull of the anomaly's core. }} {{Navbox/Data logs}} [[Category:Data logs]] 4fc50ecb141e32b0853c77bcbfcb45b95e8de097 Monastery Impression 0 370 1536 503 2025-09-12T22:02:24Z Sharparam 284703 Add needs location template wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] that can be found at [[Monastery|the Monastery]] in {{BFF}}. == Overview == {{Quote | Venturing into the anomalous zone at the edge of this crumbling colony, I was enveloped by a world devoid of sense, dominated by the cold, relentless sprawl of concrete and rebar. Rusted metal carcasses of buildings stood as grim monuments to a forgotten era, their skeletal frames interwoven with the vestiges of ancient technology and tangled cables that snaked across the ground like decaying veins. The omnipresent drone of [[Omnistructure|the structure]] reverberated through the air, a constant reminder of its oppressive presence &ndash; here, louder than anywhere before. As I picked my way through the debris, I could sense the weight of the past pressing in, the technological remnants whispering secrets of a world that once thrived but now lay silent and corroded. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] e49ac2d8ade62fa55c9473f1cf8f9d220a49aece Dreadguard (data log) 0 925 1537 2025-09-12T22:05:30Z Sharparam 284703 Created page with "{{Needs location}} '''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |What are these [[Dreadguard (NPC)|]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen. }} == See also == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] {{Navbox/Data logs}} [[Category:Data logs]]" wikitext text/x-wiki {{Needs location}} '''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |What are these [[Dreadguard (NPC)|Dreadguard]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen. }} == See also == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] {{Navbox/Data logs}} [[Category:Data logs]] b7524b233cab17929408120d64a1f2e17254b1d0 Template:Navbox/Data logs 10 290 1538 367 2025-09-12T22:05:55Z Sharparam 284703 Fix link to dreadguard data log wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard (data log)|Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[Understanding]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 3cfff727c61ad5d8c3fb1dab5f8cd372909c1190 Inquisitors 0 926 1539 2025-09-12T22:08:04Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |I know [[The Inquisition|the Inquisition]] is fanatical. It seems their way of dealing with this crippling atmosphere is by embracing and revelling in it. In their body language, you can tell they find enjoyment in this. They know they are meant to be here, they know they are witnessing a miracle. They perceive all adversity as a symptom of their growing faith. }} {{N..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |I know [[The Inquisition|the Inquisition]] is fanatical. It seems their way of dealing with this crippling atmosphere is by embracing and revelling in it. In their body language, you can tell they find enjoyment in this. They know they are meant to be here, they know they are witnessing a miracle. They perceive all adversity as a symptom of their growing faith. }} {{Navbox/Data logs}} [[Category:Data logs]] 519fb60a07fc00c20d825353d3badb1ed4d4de7c Eternal Rain 0 927 1540 2025-09-12T22:09:22Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The rain here is calming. The noise drowns everything else out. The creaking and humming of the grating concrete and rebar are all drowned out by the shattering of raindrops. Maybe one could dream here. }} {{Navbox/Data logs}} [[Category:Data logs]]" wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The rain here is calming. The noise drowns everything else out. The creaking and humming of the grating concrete and rebar are all drowned out by the shattering of raindrops. Maybe one could dream here. }} {{Navbox/Data logs}} [[Category:Data logs]] b69b9bc7af3a2e0771d51d611cec3e7210104bd4 Habitation 0 928 1541 2025-09-12T22:11:16Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This must have been intended as a densely populated area – probably for a lower social class. But there is a certain charm in the crammed alleyways and staircases leading from one potential life to another. Lives piled one on top of another. Lives affecting one another. In other places of [[The Omnistructure|the structure]] you'd be lucky to see another person in mon..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This must have been intended as a densely populated area – probably for a lower social class. But there is a certain charm in the crammed alleyways and staircases leading from one potential life to another. Lives piled one on top of another. Lives affecting one another. In other places of [[The Omnistructure|the structure]] you'd be lucky to see another person in months… sometimes years… }} {{Navbox/Data logs}} [[Category:Data logs]] 1fb43ef211ccc8342b0c2e3a86088189bda2da0e Industrial Silence 0 929 1542 2025-09-12T22:13:07Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The landscape here is dominated by industrial remnants and utilitarian constructions. Scaffolding from long-abandoned projects entwines with the silhouettes of heavy machinery, their rusting forms standing as silent sentinels to a bygone era. The structures, though now dilapidated, suggest a time when this place might have been vibrant and bustling. The structure here..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The landscape here is dominated by industrial remnants and utilitarian constructions. Scaffolding from long-abandoned projects entwines with the silhouettes of heavy machinery, their rusting forms standing as silent sentinels to a bygone era. The structures, though now dilapidated, suggest a time when this place might have been vibrant and bustling. The structure here must be rather old, no signs of builders influencing the landscape. Once, perhaps, this locale could have been a harmonious blend of functionality and beauty. }} {{Navbox/Data logs}} [[Category:Data logs]] 333247b7debd32368f96fce2d4312eb6e1db7d56 Encrypted Radiation 0 930 1543 2025-09-12T22:14:46Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Though the content remains entirely indiscernible, analysis of the radiation suggested something. The knight's presence was a haunting mix of foreboding and sorrow, as if it bore a dire message wrapped in deep remorse. Its spectral form pulsed with this eerie energy, leaving an unsettling impression of a warning long past and a sorrowful history best heeded. }} {{Navb..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Though the content remains entirely indiscernible, analysis of the radiation suggested something. The knight's presence was a haunting mix of foreboding and sorrow, as if it bore a dire message wrapped in deep remorse. Its spectral form pulsed with this eerie energy, leaving an unsettling impression of a warning long past and a sorrowful history best heeded. }} {{Navbox/Data logs}} [[Category:Data logs]] 7143dc61895b739ecf8bcd40508983b342642832 The Deep Monastery 0 931 1544 2025-09-12T22:19:29Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |In the heart of [[Desert|the desert]], beneath the oppressive mist, stands an enormous, abandoned monastery, its once-grand structure now weathered and eroded by the relentless sands. Behind it, a vast and malignant labyrinth emerges from [[Anomaly|the anomaly]], a chaotic expanse where time and space are distorted beyond recognition. Straight lines no longer align; th..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |In the heart of [[Desert|the desert]], beneath the oppressive mist, stands an enormous, abandoned monastery, its once-grand structure now weathered and eroded by the relentless sands. Behind it, a vast and malignant labyrinth emerges from [[Anomaly|the anomaly]], a chaotic expanse where time and space are distorted beyond recognition. Straight lines no longer align; they twist and bend unpredictably. Matter here perpetually dissipates and crumbles, never quite vanishing, as if the space is caught in a continuous loop of decay. The immense radiation and the absence of any sense of causality render this environment inhospitable to most. The very fabric of reality seems to fracture, making survival impossible for all but the most resilient. Despite the inhospitable conditions, rumours persist of a handful of [[The Serdars|Serdars]] who have taken refuge in the monastery, braving the inhospitable surroundings and the malignant influence of the labyrinth. }} {{Navbox/Data logs}} [[Category:Data logs]] 5f322820627894b90b0726ad7d1db3a7837028e7 Monolith 0 932 1545 2025-09-12T22:21:33Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |They say that deep within [[Desert|the desert]], there's an ancient, abandoned monastery standing solitary against the endless sands. The radiation there must be incomprehensible. No one could survive such an environment—any conscious mind would break apart instantly. Yet, whispers from those who dare to speak of it claim that [[the Serdars]], have somehow establishe..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |They say that deep within [[Desert|the desert]], there's an ancient, abandoned monastery standing solitary against the endless sands. The radiation there must be incomprehensible. No one could survive such an environment—any conscious mind would break apart instantly. Yet, whispers from those who dare to speak of it claim that [[the Serdars]], have somehow established a hold within the monastery. }} {{Navbox/Data logs}} [[Category:Data logs]] f80c637c7c0ac8d044f63faa9384b10008bc943d Desert Whispers 0 933 1546 2025-09-12T22:25:42Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Whispers from [[Desert|the desert]] say that [[Yaroslav|Jaroslav]]{{sic|nolink=y}} has sent a chilling message to anyone venturing towards their domain. The message warns that anyone who dares march into the desert will confront their destiny amidst the ruins. Jaroslav's{{sic|nolink=y}} words are shrouded in dark foreboding, suggesting that the desert itself is a cruci..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Whispers from [[Desert|the desert]] say that [[Yaroslav|Jaroslav]]{{sic|nolink=y}} has sent a chilling message to anyone venturing towards their domain. The message warns that anyone who dares march into the desert will confront their destiny amidst the ruins. Jaroslav's{{sic|nolink=y}} words are shrouded in dark foreboding, suggesting that the desert itself is a crucible of fate, where every step taken will lead to a reckoning with one's deepest fears and ultimate destiny. [[The Serdars]], it seems, have embraced the harsh, twisted reality of their environment, and their leader's message serves as a grim invitation to face the inexorable truth that awaits in the forsaken sands. They say the Serdar have turned against [[The Empire|the empire]]. }} {{Navbox/Data logs}} [[Category:Data logs]] 83287ab7c0a22abdb169ed7e3d8de3d6c1edc9aa Asylum (data log) 0 934 1547 2025-09-12T22:29:51Z Sharparam 284703 Created page with "{{Needs location}} '''Asylum''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The night at [[Asylum|the asylum]] is suffused with an oppressive darkness, where shadows dance ominously across the walls of the forsaken facility. Within these grim corridors, the absence of any ethical code has allowed for the most abominable experiments on living creatures, their suffering amplified by the cold, indifferent machinery of the asylum. The air is thick with..." wikitext text/x-wiki {{Needs location}} '''Asylum''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The night at [[Asylum|the asylum]] is suffused with an oppressive darkness, where shadows dance ominously across the walls of the forsaken facility. Within these grim corridors, the absence of any ethical code has allowed for the most abominable experiments on living creatures, their suffering amplified by the cold, indifferent machinery of the asylum. The air is thick with the stench of decay and chemical solvents, a nauseating mix that clings to everything. Dim, flickering lights reveal ghastly scenes—mangled forms and twisted apparatuses allude to a grotesque pursuit – it is unclear what is being pursued though. The asylum's eerie quiet is occasionally broken by the muffled cries and the dissonant hum of the experiments – either long past or yet to be conducted. The very essence of humanity seems to have been sacrificed here, replaced by a relentless drive for knowledge beyond what we should be allowed to know. }} {{Navbox/Data logs}} [[Category:Data logs]] 25ce1dd3a390767e876067d62f9f773a38ccfde2 Terror 0 935 1548 2025-09-12T22:32:38Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Asylum|The asylum's]] once sterile operating theaters now bear witness to grotesque amalgamations of flesh and metal, as madness seeks to forge a perverse harmony through unholy means. The stench of decay and chemicals pervades every corner, mingling with the metallic tang of blood and the acrid odor of fear. Amidst the flickering lights and shadowed corners, whisper..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Asylum|The asylum's]] once sterile operating theaters now bear witness to grotesque amalgamations of flesh and metal, as madness seeks to forge a perverse harmony through unholy means. The stench of decay and chemicals pervades every corner, mingling with the metallic tang of blood and the acrid odor of fear. Amidst the flickering lights and shadowed corners, whispers speak of a deranged pursuit—an obsession with unlocking a cosmic order through abominable acts, where ethics have long been abandoned in favor of a twisted vision of divine symmetry. It's hard to tell who is more mad. The conductors or the patients. In some sense here, there is an achieved symmetry – a symmetry of torture. }} {{Navbox/Data logs}} [[Category:Data logs]] 951bf305af5e8bd9414682762c5b55873b8c470a The Deep 0 936 1549 2025-09-12T22:35:32Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Concrete and steel rise in chaotic, dream-like silhouettes, their shapes both unsettling an oddly familiar, as if shadows themselves have taken on a sapient quality. The buildings, though solid and tangible, have an otherworldly quality, reminiscent of fleeting dreams made manifest. Each structure seems to be a fragment of a once-ethereal vision, now crystallized into..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Concrete and steel rise in chaotic, dream-like silhouettes, their shapes both unsettling an oddly familiar, as if shadows themselves have taken on a sapient quality. The buildings, though solid and tangible, have an otherworldly quality, reminiscent of fleeting dreams made manifest. Each structure seems to be a fragment of a once-ethereal vision, now crystallized into grim, imposing shapes that loom in the perpetual twilight. The city is an eerie, tangible manifestation of shadows given form, embodying the eerie, disjointed nature of dreams that have seeped down from above and coalesced into a haunting, shadowy reality. }} {{Navbox/Data logs}} [[Category:Data logs]] 2b8e4ee804705036e23de0293db9889a9a6a77e4 A Vision 0 937 1550 2025-09-12T22:37:30Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This place, a sprawling labyrinth of vast concrete walls and tangled cables, swallows everything that enters its grasp. Those who are consumed by the city are not lost to oblivion; instead, they linger as perpetual echoes, their shadows etched into the cold, unfeeling concrete. The walls themselves seem alive with these ghostly traces, their forms distorted and eternal..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |This place, a sprawling labyrinth of vast concrete walls and tangled cables, swallows everything that enters its grasp. Those who are consumed by the city are not lost to oblivion; instead, they linger as perpetual echoes, their shadows etched into the cold, unfeeling concrete. The walls themselves seem alive with these ghostly traces, their forms distorted and eternal, a testament to lives that have been frozen in an unending state of limbo. }} {{Navbox/Data logs}} [[Category:Data logs]] 8afecad3b45807c4c24b4e7b9f0d503e324a5e2a The Drone 0 938 1551 2025-09-12T22:40:09Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The city's hum is a relentless, grating sound, a discordant symphony that combines the despair of lives eternally trapped and the unfulfilled potential of what could have been. It resonates through the city's structures, a reminder of the tragedy that has befallen it. The once-vibrant reality has calcified into a grotesque parody of itself, consumed by its own anomalou..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The city's hum is a relentless, grating sound, a discordant symphony that combines the despair of lives eternally trapped and the unfulfilled potential of what could have been. It resonates through the city's structures, a reminder of the tragedy that has befallen it. The once-vibrant reality has calcified into a grotesque parody of itself, consumed by its own anomalous nature. The city's sapience, once a thriving essence of life and purpose, has been devoured by its own insatiable hunger, leaving behind only a haunting echo of what was lost. This relentless consumption has turned the city into a monument to its own tragedy, a place where sense and meaning have been irretrievably lost to the void. }} {{Navbox/Data logs}} [[Category:Data logs]] 6b3bff6e46a7f7fc8d1d47dcca48ad3d1eec976d Inhabitants 0 381 1552 1428 2025-09-12T22:40:42Z Sharparam 284703 Use needs location template instead of stub + needs coords wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] [[lore]] [[Items|item]] found in {{BFF}}. == Overview == {{Quote |The inhabitants, if they can be called that, move through their days in a trance-like manner, their actions governed by the city's oppressive rhythm rather than any discernible purpose. They drift through the shadowy streets, their forms often indistinguishable from the pervasive gloom that surrounds them. Their movements are slow and deliberate, almost mechanical, as if each step is taken in reluctant compliance with an unseen force. }} {{Navbox/Data logs}} [[Category:Lore]] [[Category:Data logs]] 99696204437b9f93e7efbd49bfdb4e5de2a6a8dc Calcified Lives 0 939 1553 2025-09-12T22:42:38Z Sharparam 284703 Created page with "{{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Many citizens have succumbed to a final, calcified state, their fates sealed in a claustrophobic stillness. These figures are trapped in a low-energy existence, frozen in the midst of their routines. Their forms are rigid and unchanging, as if the very essence of their being has been petrified by the oppressive atmosphere. Some of them, seemingly in a state of worship..." wikitext text/x-wiki {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Many citizens have succumbed to a final, calcified state, their fates sealed in a claustrophobic stillness. These figures are trapped in a low-energy existence, frozen in the midst of their routines. Their forms are rigid and unchanging, as if the very essence of their being has been petrified by the oppressive atmosphere. Some of them, seemingly in a state of worship – or delirium, towards eternal nothingness. }} {{Navbox/Data logs}} [[Category:Data logs]] 6fe361733296ddf87d7856d8925b22c10a94bd42 Manta Rays (data log) 0 940 1554 2025-09-12T22:45:19Z Sharparam 284703 Created page with "{{Needs location}} '''Manta Rays''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Immense flying manta rays drift silently through the shadowed expanse, their presence both mesmerizing and unsettling. These creatures glide gracefully between the towering concrete structures, their wide, membranous wings casting eerie shadows on the walls below. Their movement is smooth and languid, almost ethereal, as if they are part of the city's surreal atmosphere..." wikitext text/x-wiki {{Needs location}} '''Manta Rays''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |Immense flying manta rays drift silently through the shadowed expanse, their presence both mesmerizing and unsettling. These creatures glide gracefully between the towering concrete structures, their wide, membranous wings casting eerie shadows on the walls below. Their movement is smooth and languid, almost ethereal, as if they are part of the city's surreal atmosphere rather than intrusions into it. }} {{Navbox/Data logs}} [[Category:Data logs]] ad2110737544d96d1aa04ddb0ada3606e90c3a3b Template:Navbox/Data logs 10 290 1555 1538 2025-09-12T22:45:45Z Sharparam 284703 Fix link to manta rays data log wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard (data log)|Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays (data log)|Manta Rays]] * [[Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[Understanding]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> dc4e37240549a2d6c18c620e9cdacd8fa4312551 1556 1555 2025-09-12T22:46:17Z Sharparam 284703 Fix link to anomaly data log wikitext text/x-wiki <!-- The data logs should be listed in the order they appear in-game, not alphabetical --> {{Navbox | {{{1|}}} | template = Navbox/Data logs | title = [[Data logs]] | list1 = * [[Monastery Impression]] * [[Monastery Observation]] * [[Psychosis]] * [[Heartbeat]] * [[Dreadguard (data log)|Dreadguard]] * [[Inquisitors]] * [[Shadows in the Courtyard]] * [[Eternal Rain]] * [[Habitation]] * [[Industrial Silence]] * [[Encrypted Radiation]] * [[Dust Sea]] * [[The Deep Monastery]] * [[Monolith]] * [[Desert Whispers]] * [[Desert Dream]] * [[Shifting Sands]] * [[Vermillion]] * [[A Broken Reality]] * [[Asylum (data log)|Asylum]] * [[Terror]] * [[Night Horror]] * [[The Banshee]] * [[Umbral City]] * [[Call of the Void]] * [[Serpentine Visions]] * [[The Deep]] * [[A Vision]] * [[The Drone]] * [[Inhabitants]] * [[Silent Streets]] * [[Calcified Lives]] * [[Statues]] * [[Manta Rays (data log)|Manta Rays]] * [[Anomaly (data log)|Anomaly]] * [[Unknown Limits]] * [[Kaleidoscope of Dreams]] * [[The Structure]] * [[Understanding]] * [[The Grave Predicament]] * [[Intercepted Transmission]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 2dc573d37563e98478c01e48e8dea6f348c2bfc6 Anomaly (data log) 0 941 1557 2025-09-12T22:50:53Z Sharparam 284703 Created page with "{{About|the [[Data logs|data log]]||Anomaly (disambiguation)}} {{Needs location}} '''Anomaly''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] manifests as a colossal armillary sphere, an incomprehensible construct of metal rings and shifting geometries that perpetually expands and devours everything in its path. This sphere, a swirling vortex of distorted space-time, continuously grows outward, assimilating buildings, ideas, an..." wikitext text/x-wiki {{About|the [[Data logs|data log]]||Anomaly (disambiguation)}} {{Needs location}} '''Anomaly''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |[[Anomaly|The anomaly]] manifests as a colossal armillary sphere, an incomprehensible construct of metal rings and shifting geometries that perpetually expands and devours everything in its path. This sphere, a swirling vortex of distorted space-time, continuously grows outward, assimilating buildings, ideas, and entire segments of [[the Omnistructure]] into its ever-changing structure. Its rings twist and rotate with a relentless, almost sentient motion, consuming and reshaping reality around them. }} {{Navbox/Data logs}} [[Category:Data logs]] a1e0814fac5a4d47fc64d57a2e893e485cddf724 Anomaly (disambiguation) 0 942 1558 2025-09-12T22:53:28Z Sharparam 284703 Redirected page to [[Anomaly]] wikitext text/x-wiki #REDIRECT [[Anomaly]] c369f0f98957b3c2574876f7e5df8d9cd36ba461 Anomaly (location) 0 363 1559 1519 2025-09-12T22:53:54Z Sharparam 284703 Sharparam renamed page [[Anomaly]] to [[Anomaly (location)]] without leaving a redirect: Disambiguate wikitext text/x-wiki [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] == Gallery == <gallery> File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line. </gallery> {{Navbox/Locations}} [[Category:Locations]] 3d87ec3fa38d389e039733d0f695e0ee5f9b9be2 1560 1559 2025-09-12T22:54:47Z Sharparam 284703 Add about template wikitext text/x-wiki {{About|the [[Locations|location]]||Anomaly (disambiguation)}} [[File:Anomaly.png|thumb|The anomaly as depicted in the game's relocation menu.|alt=Artwork showing the anomaly in the middle of a circular labyrinth.]] The '''{{PAGENAME}}''' is a [[Locations|location]] in {{BFF}}. {{Quote | Reality melts into a surreal dreamscape. A sinister pressure emanates from the center. Time is still. }} == NPCs == * [[The Handler]] == Enemies == === Bosses === * [[Archinquisitor Belisarius (boss)|Archinquisitor Belisarius]] == Gallery == <gallery> File:Labyrinth_solution.jpg|Solution for the labyrinth.|alt=Screenshot showing a part of the labyrinth in the Anomaly area. The entrance is on the left, with a path to the center on the right drawn with a white line. </gallery> {{Navbox/Locations}} [[Category:Locations]] 8d6ea6a0bd2f7e7855c41e8e88705aa6ee9a0d2d Template:Navbox/Locations 10 293 1561 1289 2025-09-12T22:55:13Z Sharparam 284703 Fix link to anomaly location wikitext text/x-wiki <!-- The locations are ordered in the way they are listed in-game in the relocation menu --> {{Navbox | template = Navbox/Locations | title = [[Locations]] | list1 = * [[Monastery]] ** [[Monastery#Lower|Lower]] ** [[Monastery#Upper|Upper]] * [[Blok 6147]] * [[Rain District]] ** [[Rain District#Sewers|Sewers]] ** [[Rain District#Center|Center]] * [[Deluge]] * [[Asylum]] * [[Upper Blocks]] * [[Uranopolis]] ** [[Uranopolis#Tower Complex|Tower Complex]] ** [[Uranopolis#Lone Tower|Lone Tower]] * [[Ghost Town]] ** [[Ghost Town#Floor 13|Floor 13]] ** [[Ghost Town#Floor 1|Floor 1]] * [[Machinarium]] * [[Desert]] * [[Desert Mirage]] * [[Anomaly (location)|Anomaly]] * [[Unknown (location)|Unknown]] * [[Vermillion Fields]] ** [[Vermillion Fields#Plaza|Plaza]] ** [[Vermillion Fields#Temple|Temple]] }}<noinclude> {{Documentation}} [[Category:Navigation templates]] </noinclude> abc8e58e564632cf59e52482d1c53f18578b1e8d Anomaly 0 943 1562 2025-09-12T22:55:55Z Sharparam 284703 Created page with "__DISAMBIG__ == Common meanings == * [[Anomaly (location)]] * [[Anomaly (data log)]] {{Disambiguation}}" wikitext text/x-wiki __DISAMBIG__ == Common meanings == * [[Anomaly (location)]] * [[Anomaly (data log)]] {{Disambiguation}} 896baede274df850033dd62591f21daa44b7d273 1563 1562 2025-09-12T22:56:19Z Sharparam 284703 Add introduction wikitext text/x-wiki __DISAMBIG__ '''Anomaly''' may refer to: == Common meanings == * [[Anomaly (location)]] * [[Anomaly (data log)]] {{Disambiguation}} 56c479cbbdc3615fd59f08079dce10eabfd05c9e The Structure 0 944 1564 2025-09-12T23:00:34Z Sharparam 284703 Created page with "{{About|the [[Data logs|data log]]|the environment in which a majority of the game takes place|The Omnistructure}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The true nature of [[the Omnistructure]] is a tightly guarded secret, known to only a few and barely understood even by those who claim to grasp it. Attempting to comprehend its vast and enigmatic complexity is so daunting that it often drives those who tr..." wikitext text/x-wiki {{About|the [[Data logs|data log]]|the environment in which a majority of the game takes place|The Omnistructure}} {{Needs location}} '''{{PAGENAME}}''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |The true nature of [[the Omnistructure]] is a tightly guarded secret, known to only a few and barely understood even by those who claim to grasp it. Attempting to comprehend its vast and enigmatic complexity is so daunting that it often drives those who try to the brink of madness. Consequently, much of the research into the Omnistructure's nature is veiled in obscurity, with findings and progress shrouded in layers of secrecy and uncertainty. }} {{Navbox/Data logs}} [[Category:Data logs]] 6260d2366eed67e54533371044fe5c076852b818 Dreadguard 0 945 1565 2025-09-12T23:10:22Z Sharparam 284703 Created page with "__DISAMBIG__ '''Dreadguard''' may refer to: == Common meanings == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] * [[Dreadguarad (data log)]] {{Disambiguation}}" wikitext text/x-wiki __DISAMBIG__ '''Dreadguard''' may refer to: == Common meanings == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] * [[Dreadguarad (data log)]] {{Disambiguation}} 802c97aef7c757ded9eb1cfd6bbd938f465df0b9 1566 1565 2025-09-12T23:10:35Z Sharparam 284703 Fix typo wikitext text/x-wiki __DISAMBIG__ '''Dreadguard''' may refer to: == Common meanings == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] * [[Dreadguard (data log)]] {{Disambiguation}} daff31396c0e7cdc8a5575bbe11ff385e1dc3dec Dreadguard (data log) 0 925 1567 1537 2025-09-12T23:11:18Z Sharparam 284703 Add about template for disambiguation wikitext text/x-wiki {{About|the [[Data logs|data log]]||Dreadguard (disambiguation)}} {{Needs location}} '''Dreadguard''' is a [[Data logs|data log]] in {{BFF}}. == Overview == {{Quote |What are these [[Dreadguard (NPC)|Dreadguard]] made of… not a flinch, not a single discernable sign of discomfort. I know their training is gruelling, but this level of fortitude goes beyond anything I've seen. }} == See also == * [[Dreadguard (NPC)]] * [[Dreadguard (enemy)]] {{Navbox/Data logs}} [[Category:Data logs]] 70221f0a6c2be5edc5d65c4757e26b160ac00013 Dreadguard (disambiguation) 0 946 1568 2025-09-12T23:11:28Z Sharparam 284703 Redirected page to [[Dreadguard]] wikitext text/x-wiki #REDIRECT [[Dreadguard]] 8d7bcb54f0389c347d5b4e3f0f6fc39038ec6dc3 Bleak Faith: Forsaken Wiki/pages 0 5 1569 1355 2025-09-12T23:12:44Z Sharparam 284703 Add link to lore page wikitext text/x-wiki {{Main page box/start | title = Useful wiki pages | class = centered-content }} <div class="mp-links columns-2"> * {{MP link|Items|link=Items}} * {{MP link|Enemies|link=Enemies}} * {{MP link|NPCs|link=NPCs}} * {{MP link|Locations|link=Locations}} * {{MP link|Lore|link=Lore}} </div> {{Main page box/end}}<noinclude>[[Category:Main page boxes]]</noinclude><!-- don't edit this line --> 4410f18a121907d0872f3b4304e09239739595b2 Marrow 0 947 1570 2025-09-12T23:21:38Z Sharparam 284703 Created page with "{{About|the weapon|the ability|Marrow (ability)}} {{Needs location}} {{Infobox/Weapon | image = Marrow (weapon).png | Type = Twinblade | Speed = Swift | Damage type = Sharp | Abilities = Marrow (ability),Bone Barrier | Mk_min = 3 | Mk3_Damage_min = 137 | Mk3_Damage_max = 141 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{About|the weapon|the ability|Marrow (ability)}} {{Needs location}} {{Infobox/Weapon | image = Marrow (weapon).png | Type = Twinblade | Speed = Swift | Damage type = Sharp | Abilities = Marrow (ability),Bone Barrier | Mk_min = 3 | Mk3_Damage_min = 137 | Mk3_Damage_max = 141 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}. {{Navbox/Weapons}} e2c903f6ce3a13c32a4eec7c2e147e3853ce4699 1575 1570 2025-09-12T23:44:34Z Sharparam 284703 Update ability name wikitext text/x-wiki {{About|the weapon|the ability|Marrow (ability)}} {{Needs location}} {{Infobox/Weapon | image = Marrow (weapon).png | Type = Twinblade | Speed = Swift | Damage type = Sharp | Abilities = Marrow,Bone Barrier | Mk_min = 3 | Mk3_Damage_min = 137 | Mk3_Damage_max = 141 }} '''{{PAGENAME}}''' is a [[Twinblades|twinblade weapon]] in {{BFF}}. {{Navbox/Weapons}} e8ded381a75a0ed52bc39cfe57ca3870c374a33e Template:Infobox/Weapon 10 451 1571 891 2025-09-12T23:22:11Z Sharparam 284703 Improve passive and ability links wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@|@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@|@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 4445c1e03d8cded9694037701c935e0004037608 1574 1571 2025-09-12T23:43:38Z Sharparam 284703 Use a template for ability link wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | pattern = * {{Ability link|@@@@}} | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> d5d23eaefabad807d97d7e6b0a478b1a64d94518 1576 1574 2025-09-12T23:47:36Z Sharparam 284703 Use template parameter for ability list wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> a7cec6f126ae4b4f1c22b8e47720e6fab2a190ea 1578 1576 2025-09-12T23:49:17Z Sharparam 284703 Use better template for ability links wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link item | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 709ab3ef8fda5051b8aba6f4fa17630f591a8773 Template:Ability link 10 948 1572 2025-09-12T23:38:35Z Sharparam 284703 Created page with "{{#switch:{{{1}}} | Marrow = [[Marrow (ability)|Marrow]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#switch:{{{1}}} | Marrow = [[Marrow (ability)|Marrow]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude> c39cdb6ae0c8a5d81c0d85b2e6b4bae2bfb7c744 Template:Ability link/doc 10 949 1573 2025-09-12T23:42:48Z Sharparam 284703 Created page with "Used to produce a link to an [[Abilities|ability]]. This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Ability", "description": "The ability to link to", "example": "Marrow", "type": "line", "required": true } }, "description": "Generate a li..." wikitext text/x-wiki Used to produce a link to an [[Abilities|ability]]. This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Ability", "description": "The ability to link to", "example": "Marrow", "type": "line", "required": true } }, "description": "Generate a link to an ability.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Ability link|Blade Dash}}</syntaxhighlight> &rarr; {{Ability link|Blade dash}} * <syntaxhighlight lang="wikitext" inline>{{Ability link|Marrow}}</syntaxhighlight> &rarr; {{Ability link|Marrow}} Note how in the "Marrow" example, the link goes to "Marrow (ability)" without having to specify it manually. <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> b7cc18628d99f464440f1358cdb8ff29759c790a 1587 1573 2025-09-13T00:03:29Z Sharparam 284703 /* Examples */ Fix blade dash example wikitext text/x-wiki Used to produce a link to an [[Abilities|ability]]. This is primarily useful to automatically handle cases where an ability shares a name with some other page, in which case the article for the ability is usually named with a " (ability)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Ability", "description": "The ability to link to", "example": "Marrow", "type": "line", "required": true } }, "description": "Generate a link to an ability.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Ability link|Blade Dash}}</syntaxhighlight> &rarr; {{Ability link|Blade Dash}} * <syntaxhighlight lang="wikitext" inline>{{Ability link|Marrow}}</syntaxhighlight> &rarr; {{Ability link|Marrow}} Note how in the "Marrow" example, the link goes to "Marrow (ability)" without having to specify it manually. <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> c8f5da080e8ebe27d1e317cfee2963c1752dd571 Template:Ability link item 10 950 1577 2025-09-12T23:48:42Z Sharparam 284703 Created page with "* {{Ability link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki * {{Ability link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude> d357d99a640c1b615d8baad3b65ebbe2def15486 Template:Ability link item/doc 10 951 1579 2025-09-12T23:50:44Z Sharparam 284703 Created page with "Used in [[:Category:Infobox templates|infobox templates]] for ability link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Used in [[:Category:Infobox templates|infobox templates]] for ability link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> cd60abe8a158af756ecbe36cd2983bdecff37715 File:Marrow (weapon).png 6 952 1580 2025-09-12T23:51:56Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Marrow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Marrow }} == Licensing == {{License|game}} ba777602a1ac564d62d83c7006fd995bade00fce Marrow (ability) 0 953 1581 2025-09-12T23:54:56Z Sharparam 284703 Created page with "{{About|the ability|the weapon|Marrow}} {{Infobox/Ability | title = Marrow | image = Marrow (ability).png | Description = Send forward a marrow snake which damages and ruptures all enemies that come in contact with it. 206 damage and additional 154 from [[Agility]] attribute per instance of damage for a total of 360 [[Sharp]] damage. | Cooldown = 25 | Cost = 60 }} '''Marrow''' is an [[Abilities|ability]] in {{BFF}} that can be found on the [[Marrow]] weapon. {{Navbox/A..." wikitext text/x-wiki {{About|the ability|the weapon|Marrow}} {{Infobox/Ability | title = Marrow | image = Marrow (ability).png | Description = Send forward a marrow snake which damages and ruptures all enemies that come in contact with it. 206 damage and additional 154 from [[Agility]] attribute per instance of damage for a total of 360 [[Sharp]] damage. | Cooldown = 25 | Cost = 60 }} '''Marrow''' is an [[Abilities|ability]] in {{BFF}} that can be found on the [[Marrow]] weapon. {{Navbox/Abilities}} f6051ca012e67d0625759cf5a17a22736c920d1c Template:Navbox/Abilities 10 578 1582 920 2025-09-12T23:55:14Z Sharparam 284703 Add marrow ability wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Blade Dash]] * [[Divine Blessing]] * [[Marrow (ability)|Marrow]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> a7532ede7ee4e5698b18ab647a57ed0d9c8b3a6f 1585 1582 2025-09-12T23:58:31Z Sharparam 284703 Add bone barrier ability wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Blade Dash]] * [[Bone Barrier]] * [[Divine Blessing]] * [[Marrow (ability)|Marrow]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> 1999c737dfabe0b3296b8ef5ab83fdcba1f3beec File:Marrow (ability).png 6 954 1583 2025-09-12T23:56:19Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Marrow1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Marrow1 }} == Licensing == {{License|game}} d12a981eec5ed7d9a1d28e96b83da4d179754574 Bone Barrier 0 955 1584 2025-09-12T23:58:10Z Sharparam 284703 Created page with "{{Infobox/Ability | title = Bone Barrier | image = Bone Barrier (ability).png | Description = Creates a bone barrier around you, which damages and ruptures all enemies that come in contact with it. 131 damage and additional 98 from [[Agility]] attribute per instance of damage for a total of 229 [[Sharp]] damage. | Cooldown = 60 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}" wikitext text/x-wiki {{Infobox/Ability | title = Bone Barrier | image = Bone Barrier (ability).png | Description = Creates a bone barrier around you, which damages and ruptures all enemies that come in contact with it. 131 damage and additional 98 from [[Agility]] attribute per instance of damage for a total of 229 [[Sharp]] damage. | Cooldown = 60 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} 54551d5092bd238ae37f87fb6108a654f6a7c33f File:Bone Barrier (ability).png 6 956 1586 2025-09-12T23:59:09Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Marrow2 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_Marrow2 }} == Licensing == {{License|game}} feede77956a2fd35389f1e5b1fce8db8866fc1eb Template:Infobox/Armor set 10 455 1588 675 2025-09-13T00:29:01Z Sharparam 284703 Add support for Mk 0 and setting minimum Mk wikitext text/x-wiki <includeonly><!-- -->{{#invoke:Infobox|main |kind=armor-set |sep=, |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Pieces, Stats |Basic Info=Weight |Pieces=Helmet,Pauldrons,Chestguard,Legguard,Gauntlets |Helmet={{#if:{{{Helmet|}}}|[[{{{Helmet}}}]]}} |Pauldrons={{#if:{{{Pauldrons|}}}|[[{{{Pauldrons}}}]]}} |Chestguard={{#if:{{{Chestguard|}}}|[[{{{Chestguard}}}]]}} |Legguard={{#if:{{{Legguard|}}}|[[{{{Legguard}}}]]}} |Gauntlets={{#if:{{{Gauntlets|}}}|[[{{{Gauntlets}}}]]}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Sharp,Blunt,Technomancy |Sharp_label=[[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] |Blunt_label=[[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] |Technomancy_label=[[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] |Mk0_Sharp={{{Mk0_Sharp|???}}} |Mk0_Blunt={{{Mk0_Blunt|???}}} |Mk0_Technomancy={{{Mk0_Technomancy|???}}} |Mk1_Sharp={{{Mk1_Sharp|???}}} |Mk1_Blunt={{{Mk1_Blunt|???}}} |Mk1_Technomancy={{{Mk1_Technomancy|???}}} |Mk2_Sharp={{{Mk2_Sharp|???}}} |Mk2_Blunt={{{Mk2_Blunt|???}}} |Mk2_Technomancy={{{Mk2_Technomancy|???}}} |Mk3_Sharp={{{Mk3_Sharp|???}}} |Mk3_Blunt={{{Mk3_Blunt|???}}} |Mk3_Technomancy={{{Mk3_Technomancy|???}}} |Mk4_Sharp={{{Mk4_Sharp|???}}} |Mk4_Blunt={{{Mk4_Blunt|???}}} |Mk4_Technomancy={{{Mk4_Technomancy|???}}} |Mk5_Sharp={{{Mk5_Sharp|???}}} |Mk5_Blunt={{{Mk5_Blunt|???}}} |Mk5_Technomancy={{{Mk5_Technomancy|???}}} }}{{#if:{{NAMESPACE}}||[[Category:Armor sets]]}}</includeonly><noinclude> {{Documentation}}[[Category:Infobox templates]]</noinclude> 7c1ef287755c498a7d24574f795db74af44164d2 Template:Infobox/Armor set/doc 10 456 1589 677 2025-09-13T00:31:26Z Sharparam 284703 Add missing params in docs wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for an armor set", "params": { "image": { "label": "Armor set image", "description": "Name of the file used as the image for the armor set, should be at least 300 pixels wide.", "required": true, "example": "Cool armor set.png", "type": "wiki-file-name" }, "Weight": { "label": "Armor set weight", "description": "The weight class of the armor set.", "required": true, "example": "Light", "type": "string" }, "Helmet": { "label": "Helmet piece", "description": "The armor used for the helmet slot.", "required": true, "example": "Cool Helmet", "type": "wiki-page-name" }, "Pauldrons": { "label": "Pauldrons piece", "description": "The armor used for the pauldrons slot.", "required": true, "example": "Cool Pauldrons", "type": "wiki-page-name" }, "Chestguard": { "label": "Chestguard piece", "description": "The armor used for the chestguard slot.", "required": true, "example": "Cool Chestguard", "type": "wiki-page-name" }, "Legguard": { "label": "Legguard piece", "description": "The armor used for the legguard slot.", "required": true, "example": "Cool Legguard", "type": "wiki-page-name" }, "Gauntlets": { "label": "Gauntlets piece", "description": "The armor used for the gauntlets slot.", "required": true, "example": "Cool Gauntlets", "type": "wiki-page-name" }, "Mk_min": { "label": "Minimum Mk", "description": "Minimum Mk level the armor set can be found at", "required": false, "suggested": true, "example": "3", "default": "0", "type": "number" }, "Mk0_Sharp": { "label": "Mk 0 sharp rating", "description": "Total sharp defense rating for the full set at Mk 0", "required": true, "example": "1", "type": "number" }, "Mk0_Blunt": { "label": "Mk 0 blunt rating", "description": "Total blunt defense rating for the full set at Mk 0", "required": true, "example": "1", "type": "number" }, "Mk0_Technomancy": { "label": "Mk 0 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 0", "required": true, "example": "1", "type": "number" }, "Mk1_Sharp": { "label": "Mk 1 sharp rating", "description": "Total sharp defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Blunt": { "label": "Mk 1 blunt rating", "description": "Total blunt defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk1_Technomancy": { "label": "Mk 1 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 1", "required": true, "example": "5", "type": "number" }, "Mk2_Sharp": { "label": "Mk 2 sharp rating", "description": "Total sharp defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Blunt": { "label": "Mk 2 blunt rating", "description": "Total blunt defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk2_Technomancy": { "label": "Mk 2 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 2", "required": true, "example": "5", "type": "number" }, "Mk3_Sharp": { "label": "Mk 3 sharp rating", "description": "Total sharp defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk3_Blunt": { "label": "Mk 3 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk3_Technomancy": { "label": "Mk 3 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 3", "required": true, "example": "5", "type": "number" }, "Mk4_Sharp": { "label": "Mk 4 sharp rating", "description": "Total sharp defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Blunt": { "label": "Mk 4 blunt rating", "description": "Total blunt defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk4_Technomancy": { "label": "Mk 4 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 4", "required": true, "example": "5", "type": "number" }, "Mk5_Sharp": { "label": "Mk 5 sharp rating", "description": "Total sharp defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Blunt": { "label": "Mk 5 blunt rating", "description": "Total blunt defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" }, "Mk5_Technomancy": { "label": "Mk 5 technomancy rating", "description": "Total technomancy defense rating for the full set at Mk 5", "required": true, "example": "5", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} <syntaxhighlight lang="wikitext"> {{Infobox/Armor set | image = Awesome set.png | title = Awesome set | Weight = Heavy | Helmet = Awesome Helmet | Pauldrons = Awesome Pauldrons | Chestguard = Awesome Chestguard | Legguard = Awesome Legguard | Gauntlets = Awesome Gauntlets | Mk1_Sharp = 1 | Mk1_Blunt = 2 | Mk1_Technomancy = 4 | Mk2_Sharp = 2 | Mk2_Blunt = 4 | Mk2_Technomancy = 8 | Mk3_Sharp = 4 | Mk3_Blunt = 8 | Mk3_Technomancy = 16 | Mk4_Sharp = 8 | Mk4_Blunt = 16 | Mk4_Technomancy = 32 | Mk5_Sharp = 16 | Mk5_Blunt = 32 | Mk5_Technomancy = 64 }} </syntaxhighlight> 63b0ca611a0361adfe0782cc13f2a80410b5c5b2 Stalker 0 957 1590 2025-09-13T00:31:50Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Armor set | title = {{PAGENAME}} | image = Stalker (armor set).png | Helmet = Stalker's Hood | Chestguard = Stalker's Cuirass | Legguard = Stalker's Pants | Gauntlets = Stalker's Gloves }} '''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}. {{Navbox/Armor}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Armor set | title = {{PAGENAME}} | image = Stalker (armor set).png | Helmet = Stalker's Hood | Chestguard = Stalker's Cuirass | Legguard = Stalker's Pants | Gauntlets = Stalker's Gloves }} '''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}. {{Navbox/Armor}} 9557181feaf758a44fdde490492d76e9b5e6886b 1593 1590 2025-09-13T00:37:23Z Sharparam 284703 Add Mk 1 stats wikitext text/x-wiki {{Needs location}} {{Infobox/Armor set | title = {{PAGENAME}} | image = Stalker (armor set).png | Helmet = Stalker's Hood | Chestguard = Stalker's Cuirass | Legguard = Stalker's Pants | Gauntlets = Stalker's Gloves | Mk_min = 1 | Mk1_Sharp = 1740 | Mk1_Blunt = 1894 | Mk1_Technomancy = 2428 }} '''Stalker''' is an [[Armor sets|armor set]] in {{BFF}}. {{Navbox/Armor}} 2f2d7ce5ce0f99cae1ec2aac2a6417188ff049b2 File:Stalker (armor set).png 6 958 1591 2025-09-13T00:33:19Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 1592 1591 2025-09-13T00:35:08Z Sharparam 284703 Sharparam uploaded a new version of [[File:Stalker (armor set).png]] wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Mutated Ghoul 0 552 1594 865 2025-09-13T00:43:41Z Sharparam 284703 Update image link wikitext text/x-wiki {{Infobox/Boss | image = Mutated Ghoul (boss).png }} '''{{PAGENAME}}''' is an optional [[Bosses|boss]] in {{BFF}}. == Location == {{coords|6937.36|-64861.39|-17736.47}} (approximate) Located in a big grass field at the bottom of the [[Monastery]]. == Drops == * [[Anomalous Fragment]] (only in [[NG+]]) {{Navbox/Bosses}} 2fec400e2da1a3a299f24e03158d8f5786e5cf02 File:Mutated Ghoul (boss).png 6 959 1595 2025-09-13T00:43:57Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 MediaWiki:Sidebar 8 324 1596 958 2025-09-13T00:45:22Z Sharparam 284703 Add link to lore wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** Special:NewFiles|New files ** randompage-url|randompage * Bleak Faith ** Items ** Locations ** NPCs ** Enemies ** Bosses ** Lore * sidebar-customizing-wiki ** MediaWiki:Sidebar|sidebar-edit-sidebar ** MediaWiki:Common.css|sidebar-edit-common-css ** MediaWiki:Vector.css|sidebar-edit-vector-css ** MediaWiki:Common.js|sidebar-edit-common-js ** Special:Gadgets|sidebar-gadgets ** Special:Import|sidebar-special-import ** Special:Export|sidebar-special-export ** Special:AllPages|sidebar-all-pages ** Special:SpecialPages|sidebar-special-pages * wiki.gg ** support:|sidebar-support-wiki ** Wikigg-ticket-link|sidebar-submit-ticket ** wikigg-socialmedia-joinlink|wikigg-socialmedia-jointext-sidebar 6b7ee923f37b111533d902d0ae28c62b872ffc9e Template:Infobox/Boss/doc 10 861 1597 1363 2025-09-13T00:46:57Z Sharparam 284703 Use Konrad for example wikitext text/x-wiki == Examples == {{Infobox/Boss | title = Konrad the Traitor | image = Konrad the Traitor.png }} <syntaxhighlight lang="wikitext"> {{Infobox/Boss | title = Konrad the Traitor | image = Konrad the Traitor.png }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 8120c02bb422349ab95b63725c3fd58597dc2a51 Template:Infobox/Weapon/doc 10 452 1598 669 2025-09-13T00:47:40Z Sharparam 284703 /* Example */ Use Katanas for example wikitext text/x-wiki == Usage == <templatedata> { "description": "Infobox template for weapons", "params": { "title": { "label": "Weapon name", "description": "The name of the weapon", "required": false, "default": "{{PAGENAME}}", "example": "Cool Sword", "type": "string" }, "image": { "label": "Weapon image", "description": "Name of the file used as the image for the weapon, should be at least 300 pixels wide.", "required": true, "example": "Cool weapon.png", "type": "wiki-file-name" }, "Type": { "label": "Weapon type", "description": "The type of the weapon.", "required": true, "example": "Dual Wields", "type": "wiki-page-name" }, "Speed": { "label": "Weapon speed", "description": "The speed category of the weapon.", "required": true, "example": "Fast", "type": "string" }, "Damage type": { "label": "Weapon damage type", "description": "The type of damage dealt by the weapon.", "required": true, "example": "Sharp", "type": "wiki-page-name" }, "Passives": { "label": "Passive properties", "description": "Any passive properties the weapon has, comma separated", "required": false, "example": "Health Regen, Flux Regen", "type": "string" }, "Abilities": { "label": "Active abilities", "description": "Active abilities that can be used when the weapon is equipped, comma separated", "required": false, "example": "Blade Dance", "type": "string" }, "Mk_min": { "label": "Minimum mark level", "description": "The initial mark level of the weapon", "required": false, "default": "0", "example": "3", "type": "number" }, "Mk0_Damage_min": { "label": "Min. damage at Mk. 0", "description": "Minimum damage the weapon deals at Mk. 0", "required": true, "example": "5", "type": "number" }, "Mk0_Damage_max": { "label": "Max. damage at Mk. 0", "description": "Maximum damage the weapon deals at Mk. 0", "required": true, "example": "8", "type": "number" }, "Mk1_Damage_min": { "label": "Min. damage at Mk. 1", "description": "Minimum damage the weapon deals at Mk. 1", "required": true, "example": "5", "type": "number" }, "Mk1_Damage_max": { "label": "Max. damage at Mk. 1", "description": "Maximum damage the weapon deals at Mk. 1", "required": true, "example": "8", "type": "number" }, "Mk2_Damage_min": { "label": "Min. damage at Mk. 2", "description": "Minimum damage the weapon deals at Mk. 2", "required": true, "example": "10", "type": "number" }, "Mk2_Damage_max": { "label": "Max. damage at Mk. 2", "description": "Maximum damage the weapon deals at Mk. 2", "required": true, "example": "15", "type": "number" }, "Mk3_Damage_min": { "label": "Min. damage at Mk. 3", "description": "Minimum damage the weapon deals at Mk. 3", "required": true, "example": "20", "type": "number" }, "Mk3_Damage_max": { "label": "Max. damage at Mk. 3", "description": "Maximum damage the weapon deals at Mk. 3", "required": true, "example": "25", "type": "number" }, "Mk4_Damage_min": { "label": "Min. damage at Mk. 4", "description": "Minimum damage the weapon deals at Mk. 4", "required": true, "example": "30", "type": "number" }, "Mk4_Damage_max": { "label": "Max. damage at Mk. 4", "description": "Maximum damage the weapon deals at Mk. 4", "required": true, "example": "40", "type": "number" }, "Mk5_Damage_min": { "label": "Min. damage at Mk. 5", "description": "Minimum damage the weapon deals at Mk. 5", "required": true, "example": "50", "type": "number" }, "Mk5_Damage_max": { "label": "Max. damage at Mk. 5", "description": "Maximum damage the weapon deals at Mk. 5", "required": true, "example": "60", "type": "number" } }, "format": "block" } </templatedata> == Example == {{Infobox/Weapon | title = Katanas | image = Katanas.png | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen,Stuff,Cool | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Weapon | title = Katanas | image = Katanas.png | Type = Dual Wields | Speed = Fast | Damage type = Sharp | Passives = Infinite regen | Abilities = Blade Dance | Mk_min = 1 | Mk1_Damage_min = 1 | Mk1_Damage_max = 2 | Mk2_Damage_min = 4 | Mk2_Damage_max = 6 | Mk3_Damage_min = 10 | Mk3_Damage_max = 12 | Mk4_Damage_min = 20 | Mk4_Damage_max = 25 | Mk5_Damage_min = 50 | Mk5_Damage_max = 60 }} </syntaxhighlight> bfcdbd7a6f344c47407707ca0509e20db4608c7b Yaroslav 0 403 1599 568 2025-09-13T00:52:05Z Sharparam 284703 /* Location */ Fix coordinates and location link wikitext text/x-wiki {{Infobox/NPC | image = Yaroslav.png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|37597.55|115053.53|-139783.83}} Located in the [[Desert]]. Standing with his crew in front of the gate to the [[Anomaly (location)|Anomaly]]. == Quotes == === First encounter === {{Quote |Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing. Time is not of the essence here… Only choice. Soon, you'll feel it yourself. Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face… Beyond those gates, you will have to carry the greatest burden of all – your own! The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness! I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her. I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life. We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception… When you return, Collector, things will not be as they were. You will not be as you were. }} === After first encounter === {{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}} === Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] === {{Quote |Things have been set in motion that can never be explained. An eternal rain is coming our way – remember to trust your blade. You will need it more than ever. }} {{Navbox/NPCs}} 5ffe13204acf7db33ee1129652016f3e984bc004 1600 1599 2025-09-13T00:52:27Z Sharparam 284703 Update image link wikitext text/x-wiki {{Infobox/NPC | image = Yaroslav (NPC).png }} '''{{PAGENAME}}''' is an [[NPC]] in {{BFF}}. == Location == {{coords|37597.55|115053.53|-139783.83}} Located in the [[Desert]]. Standing with his crew in front of the gate to the [[Anomaly (location)|Anomaly]]. == Quotes == === First encounter === {{Quote |Welcome to [[The Anomaly|the anomaly]]. The dream of uncertainty. Here, even reality amounts to nothing. Time is not of the essence here… Only choice. Soon, you'll feel it yourself. Sometimes, I hear it all again. The voice of a girl… The color of her eyes… Frightening yet beautiful… Like mornings at war. Hours before the storm… You breathe in deeply, for it may be your last. The vast sky… And between the cold air and the smoke, a ray of sunshine on your face… Beyond those gates, you will have to carry the greatest burden of all – your own! The crusade they've mustered is blind with power… my own kind, crippled by ignorance… we are lost… lost in the wilderness! I have not seen her for so long, I wonder if she was even real… A daughter imagined in dreams perhaps… Winds be with her. I too am tired, but I gaze into the fire as it burns slowly – my eyes wide open. Some moths gather around the flame and they fly straight into it. Others fly in too and even more follow… All night long, without as much as a rustle, they melt away… I did not fear death then… but I was beginning to fear for my life. We enslaved what was left of the Forsaken… We crucified the Mechanomads for raiding time itself… We brought light to darkness and blinded all who refused to see… And even here, at the gates to the anomaly, we flay all who dare approach. You understand such methods… After all, your own path is a river of blood and deception… When you return, Collector, things will not be as they were. You will not be as you were. }} === After first encounter === {{Quote|When you return, Collector, things will not be as they were. You will not be as you were.}} === Cutscene when leaving the [[Desert]] to enter the [[Anomaly]] === {{Quote |Things have been set in motion that can never be explained. An eternal rain is coming our way – remember to trust your blade. You will need it more than ever. }} {{Navbox/NPCs}} bed8bdf7dfb54ff6627595b68af2e967f0ad7d77 File:Yaroslav (NPC).png 6 960 1601 2025-09-13T00:54:36Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Wormlord 0 547 1602 1493 2025-09-13T00:57:15Z Sharparam 284703 /* Location */ Fix coordinates wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Wormlord.png }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Overview == Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]]. == Location == {{coords|262124.20|-51428.26|-120431.34}} (approximate, as the boss constantly moves around) Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 66d200ece97308e9d63f6c38f248e0b26af266c6 1604 1602 2025-09-13T00:58:55Z Sharparam 284703 Update image link wikitext text/x-wiki {{Infobox/Boss | title = {{PAGENAME}} | image = Wormlord (boss).png }} '''{{PAGENAME}}''' is a mandatory [[Bosses|boss]] enemy in {{BFF}}. == Overview == Defeating Wormlord is required to be able to access [[Anomaly|the Anomaly]]. == Location == {{coords|262124.20|-51428.26|-120431.34}} (approximate, as the boss constantly moves around) Found in [[Desert Mirage]]. The entire area is dedicated as its boss arena. == Drops == * [[Unstable Perk Essence]] {{Navbox/Bosses}} 72448382acac08e4e72a6654ebd50a19585babaa Module:Coordinates 828 296 1603 1465 2025-09-13T00:58:22Z Sharparam 284703 Fix wrong variables used Scribunto text/plain local FULL_SPECIFIED_PATTERN = "^%d+%.%d%d+$" local NS_TO_CATEGORISE = { [0] = true, -- main [6] = true, -- file [14] = true -- category } local CHECK_PATTERN = "^-?%d+%.%d%d$" local args_util = require('Module:ArgsUtil') local p = {} ---@param val number ---@param label string local function coordNode(val, label) return mw.html.create('span') :addClass(label) :wikitext(p.formatCoord(val)) end ---@param val number ---@return string function p.formatCoord(val) local sign = val < 0 and '-' or '' val = math.abs(val) val = math.floor(val * 100) / 100 local str = tostring(val) local int = string.match(str, "^%d+") local dec = string.match(str, "%.(%d-)0*$") or '' local int_len = #int local dec_len = #dec if int_len >= 3 then return sign .. string.sub(int, 1, 4) end if dec_len == 0 then return sign .. int end return string.format("%s%s.%s", sign, int, string.sub(dec, 1, int_len == 2 and 1 or 2)) end function p.main(frame) local args = args_util.merge() return p._main(args) end function p._main(args) local x = args.x or args[1] or "" local y = args.y or args[2] or "" local z = args.z or args[3] or "" local accurate_x = string.match(x, CHECK_PATTERN) ~= nil local accurate_y = string.match(y, CHECK_PATTERN) ~= nil local accurate_z = string.match(z, CHECK_PATTERN) ~= nil local accurate = accurate_x or accurate_y or accurate_z x = tonumber(x) or 0 y = tonumber(y) or 0 z = tonumber(z) or 0 local tooltip = string.format("X: %.2f, Y: %.2f, Z: %.2f", x, y, z) local elem = mw.html.create('span') :attr('data-x', x) :attr('data-y', y) :attr('data-z', z) :attr('title', tooltip) :addClass('coordinates') :addClass('nowrap') :node(coordNode(x, 'x')) :wikitext('::') :node(coordNode(y, 'y')) :wikitext('::') :node(coordNode(z, 'z')) if not accurate then elem = elem:addClass('inaccurate') end elem = tostring(elem) local ns = mw.title.getCurrentTitle().namespace if NS_TO_CATEGORISE[ns] then if not accurate then elem = elem .. '[[Category:Pages with inaccurate coordinates]]' end elem = elem .. '[[Category:Pages with coordinates]]' end local with_styles = mw.getCurrentFrame():extensionTag { name = 'templatestyles', args = { src = 'Module:Coordinates/styles.css' } } .. elem return with_styles end return p 2d305461aa30b6d7d764ddd922920b8d55c4af6a File:Wormlord (boss).png 6 961 1605 2025-09-13T01:02:03Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Template:Coordinates/doc 10 298 1606 1466 2025-09-13T01:21:23Z Sharparam 284703 Add category for template wikitext text/x-wiki This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> &rarr; {{Coordinates|x=12.42|y=50.00|z=-32.70}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> &rarr; {{Coordinates|16.51|42.55|-4.43}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{coords|1.23|4.56|7.89}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> &rarr; {{pos|6.51|4.32|2.13}} Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot: <syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> &rarr; {{coords|1|2|3}} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 34f70e284b9b28221942957e8fdd12ac44bb3b22 1607 1606 2025-09-13T01:25:08Z Sharparam 284703 Add note on how to get accurate coordinates wikitext text/x-wiki Template to specify a coordinate in the game. '''Note:''' Due to a bug in the game, the in-game coordinate display {{strong|cannot}} be used to obtain accurate coordinates. Instead, you must use [https://framedsc.com/GeneralGuides/universal_ue4_consoleunlocker.htm the Unreal Engine 4 unlocker] software to enable the in-game console, and use the <code>showdebug</code> command to show a debug overlay that has accurate coordinates in it. If you try to use the coordinates displayed in the UI in-game, it will be marked as an error on the wiki. This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.5", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.6", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> &rarr; {{Coordinates|x=12.42|y=50.00|z=-32.70}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> &rarr; {{Coordinates|16.51|42.55|-4.43}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{coords|1.23|4.56|7.89}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> &rarr; {{pos|6.51|4.32|2.13}} Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot: <syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> &rarr; {{coords|1|2|3}} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> b0fa377634ba6ba3b7b48458c0c4d35dfa342960 1609 1607 2025-09-13T01:37:29Z Sharparam 284703 Improve documentation wikitext text/x-wiki Template to specify a coordinate in the game. '''Note:''' Due to a bug in the game, the in-game coordinate display {{strong|cannot}} be used to obtain accurate coordinates. Instead, [https://framedsc.com/GeneralGuides/universal_ue4_consoleunlocker.htm the Unreal Engine 4 unlocker] software must be used to enable the in-game console, after which the <code>showdebug</code> command can be used to show a debug overlay that has accurate coordinates in it. [[File:Debug overlay.png|frame|left|The debug overlay as it appears in-game. The second "Location" line contains accurate coordinates (X, Y, and Z).|alt=Screenshot showing the debug overlay that can be enabled in the game if using certain third-party software.]] {{clear}} If you try to use the coordinates displayed in the UI in-game, it will be marked as an error on the wiki. This template uses the {{ml|Coordinates}} Lua module. == Usage == <templatedata> { "params": { "x": { "aliases": [ "1" ], "label": "X", "description": "X coordinate", "example": "52.13", "type": "number", "required": true }, "y": { "aliases": [ "2" ], "label": "Y", "description": "Y coordinate", "example": "12.59", "type": "number", "required": true }, "z": { "aliases": [ "3" ], "label": "Z", "description": "Z coordinate (vertical axis)", "example": "-5.60", "type": "number", "required": true } }, "description": "Used to describe a location in the game.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Coordinates|x=12.42|y=50.00|z=-32.70}}</syntaxhighlight> &rarr; {{Coordinates|x=12.42|y=50.00|z=-32.70}} * <syntaxhighlight lang="wikitext" inline>{{Coordinates|16.51|42.55|-4.43}}</syntaxhighlight> &rarr; {{Coordinates|16.51|42.55|-4.43}} * <syntaxhighlight lang="wikitext" inline>{{coords|1.23|4.56|7.89}}</syntaxhighlight> &rarr; {{coords|1.23|4.56|7.89}} * <syntaxhighlight lang="wikitext" inline>{{pos|6.51|4.32|2.13}}</syntaxhighlight> &rarr; {{pos|6.51|4.32|2.13}} Supplying inaccurate coordinates (not using two decimals) will produce an error underline to make them easy to spot: <syntaxhighlight lang="wikitext" inline>{{coords|1|2|3}}</syntaxhighlight> &rarr; {{coords|1|2|3}} Inaccurate coordinates will also cause the page to be placed in the [[:Category:Pages with inaccurate coordinates|Pages with inaccurate coordinates]] category. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 1b24fae93c6fb22ca98e821fc62e95f40a446b69 File:Debug overlay.png 6 962 1608 2025-09-13T01:29:43Z Sharparam 284703 The in-game debug overlay that can be enabled by using the <code>showdebug</code> command in the game console (needs to be enabled by using third party software). wikitext text/x-wiki == Summary == The in-game debug overlay that can be enabled by using the <code>showdebug</code> command in the game console (needs to be enabled by using third party software). == Licensing == {{License|fairuse}} bf93d80c9806753c0bce5323007139846ee91c0e Template:Infobox/Ring 10 561 1610 877 2025-09-13T01:45:19Z Sharparam 284703 Add support for effects and passives wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = ring | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | Sections=Basic Info | Basic Info=Effects,Passives | Effects={{#if:{{{Effects|}}}|{{Plainlist|{{{Effects}}}}}}} | Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} }}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude> 3216156e4f850ffffa176342fb8fd0a2c2b55210 1612 1610 2025-09-13T01:47:16Z Sharparam 284703 Fix typo wikitext text/x-wiki <includeonly>{{#invoke:infobox|main | kind = ring | title = {{{title|{{PAGENAME}}}}} | image = {{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} | sections=Basic Info | Basic Info=Effects, Passives | Effects={{#if:{{{Effects|}}}|{{Plainlist|{{{Effects}}}}}}} | Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} }}{{Main other|[[Category:Rings]]}}</includeonly><noinclude>{{Documentation}}</noinclude> ac580d6ab5e3fb231fe6dee5e41ff2297a30b684 Template:Infobox/Ring/doc 10 562 1611 878 2025-09-13T01:46:34Z Sharparam 284703 Update example wikitext text/x-wiki == Example == {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png | Effects = * Some effect * Does other stuff too | Passives = Strength bonus,Agility bonus }} <syntaxhighlight lang="wikitext"> {{Infobox/Ring | title = Cool Ring | image = Cool Ring.png | Effects = * Some effect * Does other stuff too | Passives = Strength bonus,Agility bonus }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 8a4e5bff7d362ec2209b352f048754f127bea8d4 1628 1611 2025-09-13T02:06:00Z Sharparam 284703 Use rammstein ring for example wikitext text/x-wiki == Example == {{Infobox/Ring | title = Cool Ring | image = Ring of Rammstein (ring).png | Effects = * Some effect * Does other stuff too | Passives = Strength bonus,Agility bonus }} <syntaxhighlight lang="wikitext"> {{Infobox/Ring | title = Cool Ring | image = Ring of Rammstein (ring).png | Effects = * Some effect * Does other stuff too | Passives = Strength bonus,Agility bonus }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> d138ac5857a2fa2afd11b240ee5a1298eedfb6c7 Ring of Burning Desire 0 519 1613 802 2025-09-13T01:49:29Z Sharparam 284703 Add effect, update file name wikitext text/x-wiki {{Infobox/Ring | image = Ring of Burning Desire (ring).png | title = {{PAGENAME}} | Effects = * +20% chance to inflict [[Heat|Heat status effect]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] that can be found in {{BFF}}. == Acquisition == Drops from [[Diver]] [[enemies]] in [[Deluge|the Deluge]] area. {{Navbox/Rings}} 79d408a95afaad8989b7041980f3a858c86d3087 File:Ring of Burning Desire (ring).png 6 963 1614 2025-09-13T01:50:45Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_37 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_37 }} == Licensing == {{License|game}} 7665ed47d5c799784e86fb0e18c8435cdf155c0e Ring of Casting Speed 0 520 1615 804 2025-09-13T01:52:17Z Sharparam 284703 Update effects and image name wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Casting Speed (ring).png | Effects = * -10% attack power * +20% technocasting speed }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Acquisition == Drops from a giant enemy in [[Uranopolis]], around {{coords|-1151|-4475|1453}}. {{Navbox/Rings}} b63998c2b57c5f3608675a0c28e564d0b388c0aa File:Ring of Casting Speed (ring).png 6 964 1616 2025-09-13T01:52:54Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_34 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_34 }} == Licensing == {{License|game}} fcbdab131e1d2c09f171516349b8cd15e3d123a6 Ring of Rammstein 0 521 1617 806 2025-09-13T01:53:31Z Sharparam 284703 Update passives and image name wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Rammstein (ring).png | Passives = Momentum Strike }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{main|Tech Shield#Location}} This item is located on the same corpse as the [[Tech Shield]]. {{Navbox/Rings}} 1fcd9923fe535740cede487369bdd10cdd73cd43 File:Ring of Rammstein (ring).png 6 965 1618 2025-09-13T01:54:21Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_90 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_90 }} == Licensing == {{License|game}} 830f2d79c7781f398fc28bca0f9dae31ff04207a Ring of Serpent 0 748 1619 1157 2025-09-13T01:55:03Z Sharparam 284703 Update effects, passives, and image name wikitext text/x-wiki {{Infobox/Ring | image = Ring of Serpent (ring).png | title = {{PAGENAME}} | Passives = Swift Reflexes | Effects = * +2 [[Agility]] }} == Location == Near one of the underwater red lights in [[Deluge]]. {{Navbox/Rings}} d59a9f1f8977fd40fc8b976d3c2891c5e480ffd4 File:Ring of Serpent (ring).png 6 966 1620 2025-09-13T01:56:05Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_88 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_88 }} == Licensing == {{License|game}} 6a44f24fa8ecc46c8b1d586f45e3f01690696384 Ring of Exceeding Talent 0 522 1621 808 2025-09-13T01:56:58Z Sharparam 284703 Update effects and image name wikitext text/x-wiki {{Infobox/Ring | title = {{PAGENAME}} | image = Ring of Exceeding Talent (ring).png | Effects = * +3 [[Strength]] * +3 [[Agility]] * +3 [[Constitution]] * +3 [[Intelligence]] }} '''{{PAGENAME}}''' is a [[Rings|ring]] in {{BFF}}. == Location == {{coords|3720|1159|-1397}} Located in the [[Desert]] on a toppled pillar in the area with Yaroslav's crew (same location as the [[Handler Echo]]). == See also == * [[Ring of Lesser Talent]] – The weakest version of this ring. * [[Ring of Talent]] – A weaker version of this ring. {{Navbox/Rings}} a0b746136c3347050b18c4b0b95e7851eab96532 File:Ring of Exceeding Talent (ring).png 6 967 1622 2025-09-13T01:57:49Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_100 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyRings/256x256/fantasyRing_100 }} == Licensing == {{License|game}} 4cd7d1e578ba59fdab07b4448f547e3a1f2aeea4 Template:Infobox/Ability/doc 10 460 1623 685 2025-09-13T01:59:19Z Sharparam 284703 Use an existing image for example wikitext text/x-wiki == Example == {{Infobox/Ability |image=OrientalDash.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} <syntaxhighlight lang="wikitext"> {{Infobox/Ability |image=OrientalDash.png |title=Shoot Star |Description=Shoots a star. |Cost=50 |Cooldown=12 }} </syntaxhighlight> 59c35e2e2d842e289e5c521db8c65cd5f786843e Momentum Strike 0 968 1624 2025-09-13T02:02:35Z Sharparam 284703 Created page with "{{Infobox/Passive | image = Momentum Strike (passive).png | Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}" wikitext text/x-wiki {{Infobox/Passive | image = Momentum Strike (passive).png | Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} 6f77a86032f42bde0253c72b06e37cf937ad5997 1627 1624 2025-09-13T02:04:59Z Sharparam 284703 Fix image wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Rolling deals damage basead on [[Strength]] in a circle around you. Can only be activated once every {{Duration|s=30|display=30 seconds}}. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} ab3923bb3223ec689cca90eefb31473bbf59c02c Template:Navbox/Passives 10 838 1625 1314 2025-09-13T02:02:52Z Sharparam 284703 Add [[Momentum Strike]] wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Momentum Strike]] * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude> 21ab89b7493ffa70b704f538de819b449133f146 Template:Infobox/Passive/doc 10 836 1626 1312 2025-09-13T02:04:40Z Sharparam 284703 Use universal passive icon in example wikitext text/x-wiki == Examples == {{Infobox/Passive | title = Example Passive | image = Universal Passive.png | Description = Increases your stats to ungodly amounts. }} <syntaxhighlight lang="wikitext"> {{Infobox/Passive | title = Example Passive | image = Universal Passive.png | Description = Increases your stats to ungodly amounts. }} </syntaxhighlight> <includeonly>{{Sandbox other||[[Category:Infobox templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 0b3d42797f0fac836341e748789c732f7c7e63ef Template:Infobox/Shield/doc 10 458 1629 681 2025-09-13T02:06:35Z Sharparam 284703 Use wooden shield image for example wikitext text/x-wiki == Examples == {{Infobox/Shield | image = Wooden Shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} <syntaxhighlight lang="wikitext"> {{Infobox/Shield | image = Wooden Shield.png | title = Test Shield | Weight = Light | Abilities = Shield Bash | Mk0_Sharp = 10 | Mk0_Blunt = 10 | Mk0_Technomancy = 10 | Mk1_Sharp = 20 | Mk1_Blunt = 20 | Mk1_Technomancy = 20 | Mk2_Sharp = 30 | Mk2_Blunt = 30 | Mk2_Technomancy = 30 | Mk3_Sharp = 40 | Mk3_Blunt = 40 | Mk3_Technomancy = 40 | Mk4_Sharp = 50 | Mk4_Blunt = 50 | Mk4_Technomancy = 50 | Mk5_Sharp = 60 | Mk5_Blunt = 60 | Mk5_Technomancy = 60 }} </syntaxhighlight> 3b54a1bdb8c7ec0d368ca9b9da5433b3a64ec131 Basilisk Hack 0 969 1630 2025-09-13T15:16:45Z Sharparam 284703 Created page with "{{Infobox/Item | type = consumable | image = Basilisk Hack (item).png | Description = Reset all of your assigned [[attributes]]. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Manufacturing == {{Recipe | type = manufacturing | result = Basilisk Hack | ingredient1 = Sludge | ingredient1_count = 20 | ingredient2 = Fractal Fungus | ingredient3 = Essence | ingredient3_count = 6 }} {{Navbox/Consumables}}" wikitext text/x-wiki {{Infobox/Item | type = consumable | image = Basilisk Hack (item).png | Description = Reset all of your assigned [[attributes]]. Usable from inventory. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Manufacturing == {{Recipe | type = manufacturing | result = Basilisk Hack | ingredient1 = Sludge | ingredient1_count = 20 | ingredient2 = Fractal Fungus | ingredient3 = Essence | ingredient3_count = 6 }} {{Navbox/Consumables}} c8b7962143a466248652806ae936bdcbebcda643 File:Basilisk Hack (item).png 6 970 1631 2025-09-13T15:17:18Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_47 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_47 }} == Licensing == {{License|game}} e38ad62164ab71347496c696676ecf82203c1d0a Glowbug 0 971 1632 2025-09-13T15:18:52Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Glowbug (item).png | Description = A glow effect around character, allowing you to see better for {{Duration|s=120|display=120 seconds}}. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = consumable | image = Glowbug (item).png | Description = A glow effect around character, allowing you to see better for {{Duration|s=120|display=120 seconds}}. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. {{Navbox/Consumables}} 0075e7ef04cfeaee9e5c07b3d4e1bfc4c9099223 File:Glowbug (item).png 6 972 1633 2025-09-13T15:19:21Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/glowbug }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/glowbug }} == Licensing == {{License|game}} c9c9426eae039f67be080bcb326ba46188ab6c7e Metal Arrow Pack 0 973 1634 2025-09-13T15:21:33Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Metal Arrow Pack (item).png | Description = Adds 9 [[Metal Arrows|metal arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Metal Arrow Pack | ingredient1 = Metal Arrows | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = consumable | image = Metal Arrow Pack (item).png | Description = Adds 9 [[Metal Arrows|metal arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Metal Arrow Pack | ingredient1 = Metal Arrows | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumables}} 05ea3953bc77dff9a02beb98f629b48576b0ccd6 File:Metal Arrow Pack (item).png 6 974 1635 2025-09-13T15:21:58Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/icon_quiver2 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/icon_quiver2 }} == Licensing == {{License|game}} b4a0afb98f7a8c94da4914c6b30f8817637988ac Piercing Arrow Pack 0 975 1636 2025-09-13T15:23:50Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = consumable | image = Piercing Arrow Pack (item).png | Description = Adds 9 [[Piercing Arrow|piercing arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Piercing Arrow Pack | ingredient1 = Piercing Arrow | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumabl..." wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = consumable | image = Piercing Arrow Pack (item).png | Description = Adds 9 [[Piercing Arrow|piercing arrows]] to your quiver. Any arrows that can't fit in the quiver will be placed in the backpack instead. }} '''{{PAGENAME}}''' is a [[Consumables|consumable]] in {{BFF}}. == Crafting == {{Recipe | result = Piercing Arrow Pack | ingredient1 = Piercing Arrow | ingredient1_count = 9 | ingredient2 = Machinite }} {{Navbox/Consumables}} 18bd2d324394484b889ede1c2e02ac6e80fb0bb1 File:Piercing Arrow Pack (item).png 6 976 1637 2025-09-13T15:24:14Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/icon_quiver1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/icon_quiver1 }} == Licensing == {{License|game}} 8417858eba552ceb85e1329362a2e88381c6981c Piercing Arrow 0 822 1638 1277 2025-09-13T15:26:03Z Sharparam 284703 Add crafting recipes wikitext text/x-wiki {{Infobox/Item | image = Piercing Arrow.png | type = ammunition | Description = A projectile that ignores up to 2000 armor rating. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. == Crafting == {{Recipe | result = Piercing Arrow | result_count = 6 | ingredient1 = Machinite | ingredient1_count = 2 | ingredient2 = Gravicle Dust }} {{Recipe | result = Piercing Arrow | result_count = 6 | ingredient1 = Metal Arrows | ingredient1_count = 6 | ingredient2 = Gravicle Dust }} {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} 5422c1108397ac11f50f4553bf562d2cabc2eebf Metal Arrows 0 816 1639 1272 2025-09-13T15:27:17Z Sharparam 284703 Add crafting recipes wikitext text/x-wiki {{Infobox/Item | image = Metal Arrows.png | type = ammunition | Description = A common and replaceable projectile. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. == Crafting == {{Recipe | result = Metal Arrows | result_count = 6 | ingredient = Machinite | ingredient_count = 2 }} {{Recipe | result = Metal Arrows | result_count = 2 | ingredient = Broken Arrow | ingredient_count = 3 }} {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} c7ff9c78c44a27cd62bd990ded25c5f30680e677 Shock Arrows 0 824 1640 1279 2025-09-13T15:28:38Z Sharparam 284703 Add crafting recipes wikitext text/x-wiki {{Infobox/Item | image = Shock Arrows.png | type = ammunition | Description = A projectile that stuns most enemies for {{Duration|s=7|display=7 seconds}}. }} '''{{PAGENAME}}''' is a type of [[ammunition]] in {{BFF}}. == Crafting == {{Recipe | result = Shock Arrows | result_count = 3 | ingredient1 = Machinite | ingredient2 = Neurilium }} {{Recipe | result = Shock Arrows | result_count = 3 | ingredient1 = Metal Arrows | ingredient1_count = 3 | ingredient2 = Neurilium }} {{Navbox/Ammunition}} {{Navbox/Longbows|state=collapsed}} f0dfa24f23ccb001698fd264269f0acda2514236 Mystery Concoction 0 977 1641 2025-09-13T15:32:10Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = concoction | image = Mystery Concoction (item).png | Description = Drink me. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. == Manufacturing == {{Recipe | result = Mystery Concoction | ingredient = Sludge | ingredient_count = 12 }} {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = concoction | image = Mystery Concoction (item).png | Description = Drink me. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. == Manufacturing == {{Recipe | result = Mystery Concoction | ingredient = Sludge | ingredient_count = 12 }} {{Navbox/Consumables}} 2a859fcaf6c5e49d96ccf4645792c4b0abfec701 1644 1641 2025-09-13T15:35:54Z Sharparam 284703 Add monastery location wikitext text/x-wiki {{Infobox/Item | type = concoction | image = Mystery Concoction (item).png | Description = Drink me. }} '''{{PAGENAME}}''' is a [[Concoctions|concoction]] in {{BFF}}. == Locations == === [[Monastery]] === {{Needs coordinates|tiny=yes|what=This section}} One can be found at the start of the game, behind where the player spawns in after the intro cutscene. == Manufacturing == {{Recipe | result = Mystery Concoction | ingredient = Sludge | ingredient_count = 12 }} {{Navbox/Consumables}} 883b64cf5d1dfb02faab81245e8a1108ce91f979 Template:Navbox/Consumables 10 286 1642 1306 2025-09-13T15:32:37Z Sharparam 284703 Remove mystery concoction from fluid list wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Consumables | title = [[Consumables]] | list1 = * [[Asylum Brew]] * [[Basilisk Hack]] * [[Glowbug]] * [[Metal Arrow Pack]] * [[Piercing Arrow Pack]] | group2 = [[Fluids]] | list2 = * [[Ionization Fluid]] ** [[Lesser Ionization Fluid|Lesser]] ** [[Greater Ionization Fluid|Greater]] * [[Regenerative Fluid]] ** [[Greater Regenerative Fluid|Greater]] * [[Restorative Fluid]] ** [[Lesser Restorative Fluid|Lesser]] ** [[Greater Restorative Fluid|Greater]] | group3 = [[Concoctions]] | list3 = * [[Diver's Lungs Concoction]] ** [[Improved Diver's Lungs Concoction|Improved]] * [[Dreadguard's Concoction]] ** [[Greater Dreadguard's Concoction|Greater]] * [[Experience Concoction]] * [[Fluxshield Concoction]] * [[Forsaken Concoction]] ** [[Greater Forsaken Concoction|Greater]] * [[Indestructible Concoction]] * [[Jaeger's Concoction]] ** [[Greater Jaeger's Concoction|Greater]] * [[Mystery Concoction]] * [[Stoneshield Concoction]] * [[Spongeskin Concoction]] * [[Technomancer's Concoction]] ** [[Greater Technomancer's Concoction|Greater]] * [[Concoction: Aberrant's Blood]] * [[Concoction: Agility]] * [[Concoction: All Attributes]] * [[Concoction: Berserker's Tenacity]] * [[Concoction: Constitution]] * [[Concoction: Flux Regen]] * [[Concoction: Health Regen]] * [[Concoction: Intelligence]] * [[Concoction: Mighty Regen]] * [[Concoction: Powerful Immune System]] * [[Concoction: Rapid Recovery]] * [[Concoction: Strength]] * [[Concoction: Zealot's Tears]] }}<noinclude>[[Category:Navigation templates]]</noinclude> 25a77ebb77b38a0a394a21d17595b28ef884824b File:Mystery Concoction (item).png 6 978 1643 2025-09-13T15:33:24Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_4 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/FantasyPotions/256x256/FantasyPotion_4 }} == Licensing == {{License|game}} 6b6767922e588486008db577835f98663ee80637 Regenerative Fluid 0 979 1645 2025-09-13T15:37:42Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=10|display=10 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = fluid | image = Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=10|display=10 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}} 4ec3a2e7e6b6ca562d663998daf05f66fe8de140 File:Regenerative Fluid (item).png 6 980 1646 2025-09-13T15:38:22Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_37 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_37 }} == Licensing == {{License|game}} 805cc410b5e368d7769d8c7a258757e28c562dba Greater Regenerative Fluid 0 981 1647 2025-09-13T15:39:29Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Greater Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=6|display=6 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = fluid | image = Greater Regenerative Fluid (item).png | Description = Restores 50% of total [[health]] over {{Duration|s=6|display=6 seconds}}. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. {{Navbox/Consumables}} 034871580401f9046c0f5090e72c81d1c6cd7a87 File:Greater Regenerative Fluid (item).png 6 982 1648 2025-09-13T15:40:01Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_42 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_42 }} == Licensing == {{License|game}} 108b798638cc22ec8f81545a19e46e34d7a8fb62 Restorative Fluid 0 983 1649 2025-09-13T15:45:05Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 450 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 2 | ingredient2 = Gingko Leaves | ingredient2_count = 2 }} {{Recipe | result = Restorative Fluid | ingredient1 = Lesser Restorat..." wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = fluid | image = Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 450 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 2 | ingredient2 = Gingko Leaves | ingredient2_count = 2 }} {{Recipe | result = Restorative Fluid | ingredient1 = Lesser Restorative Fluid | ingredient1_count = 2 | ingredient2 = Gingko Leaves }} == Trivia == * The description refers to it as a concoction, despite both the name and in-game categorization using <q>fluid</q>. {{Navbox/Consumables}} 5a9d8320e23ba4359ece370a2e00dfe45a21f84e File:Restorative Fluid (item).png 6 984 1650 2025-09-13T15:45:34Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_75 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_75 }} == Licensing == {{License|game}} b82b273f2ea2ce0e864477a49442b22fa671c1af Lesser Restorative Fluid 0 985 1651 2025-09-13T15:46:55Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Lesser Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 225 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Lesser Restorative Fluid | ingredient1 = Sludge | ingredient2 = Gingko Leaves }} {{Navbox/Consumables}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = fluid | image = Lesser Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 225 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Lesser Restorative Fluid | ingredient1 = Sludge | ingredient2 = Gingko Leaves }} {{Navbox/Consumables}} 5af7ba971fd8e21a39ba0187ce109175def7691e File:Lesser Restorative Fluid (item).png 6 986 1652 2025-09-13T15:47:24Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_84 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_84 }} == Licensing == {{License|game}} 0db0ef78c90ef2a454f33f9f1f65a8033c04fc0a Greater Restorative Fluid 0 987 1653 2025-09-13T15:49:15Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Item | type = fluid | image = Greater Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 850 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Greater Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 3 | ingredient2 = Gingko Leaves | ingredient2_count = 3 }} {{Recipe | result = Greater Restorative Fluid | ingre..." wikitext text/x-wiki {{Needs location}} {{Infobox/Item | type = fluid | image = Greater Restorative Fluid (item).png | Description = A terribly potent concoction used to regenerate lost tissue. Restores 850 [[Health]]. }} '''{{PAGENAME}}''' is a [[Fluids|fluid]] in {{BFF}}. == Crafting == {{Recipe | result = Greater Restorative Fluid | ingredient1 = Sludge | ingredient1_count = 3 | ingredient2 = Gingko Leaves | ingredient2_count = 3 }} {{Recipe | result = Greater Restorative Fluid | ingredient1 = Restorative Fluid | ingredient1_count = 2 | ingredient2 = Gingko Leaves }} {{Navbox/Consumables}} e15a707e7c10201f6df25e53bbb3314ceb4b126b File:Greater Restorative Fluid (item).png 6 988 1654 2025-09-13T15:49:38Z Sharparam 284703 {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_89 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/Resources/ClassicPotions/256x256/ClassicPotion_89 }} == Licensing == {{License|game}} 14d11b68bcc8f2ec0ce187a9cdf3be8a093e25f3 Armor Buster 0 989 1655 2025-09-13T15:52:14Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Armor Buster (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Armor Buster (passive) | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Armor Buster (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Armor Buster (passive) | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}} 1c6724ef7c97bed7971e0036d019b2222e7fa5c8 1662 1655 2025-09-13T15:57:57Z Sharparam 284703 Fix passive wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Armor Buster (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Armor Buster | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}} 570b9f9c629465acf94664dfe540475a410b1428 Template:Infobox/Weapon 10 451 1656 1578 2025-09-13T15:53:21Z Sharparam 284703 Add support for greatweapons wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | pattern = * [[@@@@]] | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link item | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | greatweapon = [[Greatweapons|Greatweapon]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | greatweapon = [[Category:Greatweapons]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | greatweapon = greatweapon | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 0f2366cccf831534d1e0ac0c1765b8cdb35d6561 1661 1656 2025-09-13T15:57:33Z Sharparam 284703 Use template for passive links wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=weapon |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | template = Passive link item | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link item | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | greatweapon = [[Greatweapons|Greatweapon]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | greatweapon = [[Category:Greatweapons]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{{title|}}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | greatweapon = greatweapon | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 6929e21a60cf53738335a0c32200966615678841 Template:Passive link 10 990 1657 2025-09-13T15:54:20Z Sharparam 284703 Created page with "{{#switch:{{{1}}} | Armor Buster = [[Armor Buster (passive)|Armor Buster]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#switch:{{{1}}} | Armor Buster = [[Armor Buster (passive)|Armor Buster]] | #default = [[{{{1}}}]] }}<!-- --><noinclude>{{Documentation}}</noinclude> 72eaff1bc43a162efe03cce838bee85d1fa38e37 Template:Passive link/doc 10 991 1658 2025-09-13T15:56:11Z Sharparam 284703 Created page with "Used to produce a link to a [[Passives|passive]]. This is primarily useful to automatically handle cases where a passive shares a name with some other page, in which case the article for the passive is usually named with a " (passive)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Passive", "description": "The passive to link to", "example": "Armor Buster", "type": "line", "required": true } }, "description": "Generate a..." wikitext text/x-wiki Used to produce a link to a [[Passives|passive]]. This is primarily useful to automatically handle cases where a passive shares a name with some other page, in which case the article for the passive is usually named with a " (passive)" suffix. == TemplateData == <templatedata> { "params": { "1": { "label": "Passive", "description": "The passive to link to", "example": "Armor Buster", "type": "line", "required": true } }, "description": "Generate a link to a passive.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Passive link|Heavy Hitter}}</syntaxhighlight> &rarr; {{Ability link|Heavy Hitter}} * <syntaxhighlight lang="wikitext" inline>{{Passive link|Armor Buster}}</syntaxhighlight> &rarr; {{Passive link|Armor Buster}} Note how in the "Armor Buster" example, the link goes to "Armor Buster (passive)" without having to specify it manually. <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> 99f3b51e24ae072ac18d9ffecb649e0362fb082a Template:Passive link item 10 992 1659 2025-09-13T15:56:44Z Sharparam 284703 Created page with "* {{Passive link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki * {{Passive link|{{{1}}}}}<!-- --><noinclude>{{Documentation}}</noinclude> b3c13eb46479c7c5c03f244659f654527f06f391 Template:Passive link item/doc 10 993 1660 2025-09-13T15:57:03Z Sharparam 284703 Created page with "Used in [[:Category:Infobox templates|infobox templates]] for passive link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude>" wikitext text/x-wiki Used in [[:Category:Infobox templates|infobox templates]] for passive link lists. Not intended for usage elsewhere. <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly> <noinclude>[[Category:Template documentation]]</noinclude> 0a673de692e0447983054a6ea6c66e98bdf2045e File:Armor Buster (weapon).png 6 994 1663 2025-09-13T15:59:02Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArmorBuster }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_ArmorBuster }} == Licensing == {{License|game}} 40690993aaa408ba8201c628b9f11022580d9b60 Eviscerator 0 995 1664 2025-09-13T16:00:57Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Eviscerator (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Abilities = Expose Armor, Berserking Leap | Mk_min = 3 | Mk3_Damage_min = 406 | Mk3_Damage_max = 425 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Eviscerator (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Abilities = Expose Armor, Berserking Leap | Mk_min = 3 | Mk3_Damage_min = 406 | Mk3_Damage_max = 425 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}} 7cb927045a3dc22df2c45efeb4185c94495174dc File:Eviscerator (weapon).png 6 996 1665 2025-09-13T16:01:25Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Eviscerator }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_Eviscerator }} == Licensing == {{License|game}} 41a949e066e9b98b46f6b36d57cf47a6bd532b19 Greathammer 0 997 1666 2025-09-13T16:02:53Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Greathammer (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Bash, Pestilence | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Greathammer (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Blunt | Passives = Bash, Pestilence | Mk_min = 2 | Mk2_Damage_min = 338 | Mk2_Damage_max = 354 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}} 8ef5d4e7b02b0f3e48ab9e0d6b072084519e10c1 File:Greathammer (weapon).png 6 998 1667 2025-09-13T16:03:26Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_HeavyMace }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_HeavyMace }} == Licensing == {{License|game}} 107d30d1dfb1a99456891d05464cd541f67fdb9c Titan Slayer Greatsword 0 999 1668 2025-09-13T16:05:04Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Titan Slayer Greatsword (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Sharp | Abilities = Guillotine, Downward Slash | Mk_min = 3 | Mk3_Damage_min = 312 | Mk3_Damage_max = 343 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Titan Slayer Greatsword (weapon).png | Type = Greatweapon | Speed = Sluggish | Damage type = Sharp | Abilities = Guillotine, Downward Slash | Mk_min = 3 | Mk3_Damage_min = 312 | Mk3_Damage_max = 343 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. {{Navbox/Weapons}} daa2b889a37d2be9992ceb862e00a9a17236bec6 File:Titan Slayer Greatsword (weapon).png 6 1000 1669 2025-09-13T16:05:31Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TitanSlayer }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_TitanSlayer }} == Licensing == {{License|game}} ba7d88ced1e0fc8bf7d279a4bd43be5a0de28ede Armor Buster (passive) 0 1001 1670 2025-09-13T16:07:13Z Sharparam 284703 Created page with "{{Infobox/Passive | image = Universal Passive.png | Description = Your melee attacks ignore 50% of target's current Armor Ratings. }} {{Navbox/Passives}}" wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Your melee attacks ignore 50% of target's current Armor Ratings. }} {{Navbox/Passives}} 8a8234e6e36bcfee142b3ce41798020b82fb993c 1671 1670 2025-09-13T16:07:35Z Sharparam 284703 Add intro text wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Your melee attacks ignore 50% of target's current Armor Ratings. }} '''Armor Buster''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} 5f726a12a6803a7b9dd201a555f9334063ac7642 Template:Navbox/Passives 10 838 1672 1625 2025-09-13T16:08:02Z Sharparam 284703 Add armor buster wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Armor Buster (passive)|Armor Buster]] * [[Momentum Strike]] * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude> 2c3e5ca88cb446ba671569d4c26691e692200b8e 1674 1672 2025-09-13T16:10:16Z Sharparam 284703 Add [[Greater Divine Judgement]] wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Armor Buster (passive)|Armor Buster]] * [[Greater Divine Judgement]] * [[Momentum Strike]] * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude> 724953fa74861005357e3d004c1c121959e1e66e 1684 1674 2025-09-13T16:34:08Z Sharparam 284703 Add missing passives wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Passives | title = [[Passives]] | list = * [[Armor Buster (passive)|Armor Buster]] * [[Bash]] * [[Bloodthirst]] * [[Consistent Strikes]] * [[Critical Strike (passive)|Critical Strike]] * [[Experience Amplification]] * [[Experience Suppression]] * [[Extended Evasion]] * [[Flux Efficiency]] * [[Giant Slayer]] * [[Greater Divine Judgement]] * [[Heavy Hitter]] * [[Lacerate]] * [[Lifesteal (passive)|Lifesteal]] * [[Minor Flux Regen]] * [[Momentum Strike]] * [[Muscle Mastery]] * [[Pestilence]] * [[Powerful Decay]] * [[Rapid Fire]] * [[Scavenger's Rejuvenation]] * [[Serene Movement]] * [[Spare Shot]] * [[Spikes]] * [[Summoning Extension]] * [[Survivor's Wisdom]] * [[Swift Reflexes]] * [[Techno-Defiance]] * [[Universal Judgment]] * [[Vermillion Judgment]] * [[Vitality Boost]] * [[Volatile Illusions]] * [[Vulnerable Dodge]] }}<noinclude>{{Documentation}}</noinclude> 553ac93a26aa364ed2abcef924832eed24267f25 Greater Divine Judgement 0 1002 1673 2025-09-13T16:09:57Z Sharparam 284703 Created page with "{{Infobox/Passive | image = Universal Passive.png | Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]]. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}}" wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]]. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} af3ce6e544ce2a64b0b374250369db83e90c1c10 1675 1673 2025-09-13T16:10:47Z Sharparam 284703 Sharparam renamed page [[Greater Divine Judgment]] to [[Greater Divine Judgement]] without leaving a redirect: Misspelled title wikitext text/x-wiki {{Infobox/Passive | image = Universal Passive.png | Description = Deals an extra 24% damage against all non-regular/forsaken [[enemies]]. }} '''{{PAGENAME}}''' is a [[Passives|passive]] in {{BFF}}. {{Navbox/Passives}} af3ce6e544ce2a64b0b374250369db83e90c1c10 Divine Greataxe 0 470 1676 705 2025-09-13T16:11:11Z Sharparam 284703 Fix typo in passive wikitext text/x-wiki {{Infobox/Weapon | title = {{PAGENAME}} | image = Divine Greataxe.png | Type = Greatweapon | Damage type = Sharp | Speed = Sluggish | Passives = Greater Divine Judgement | Abilities = Regal Radiance | Mk4_Damage_min = 597 | Mk4_Damage_max = 656 }} '''{{PAGENAME}}''' is a [[Greatweapons|greatweapon]] in {{BFF}}. == Location == {{coords|43210.37|165132.67|-141105.39}} Found in the [[Anomaly]]. From the [[Homunculus]], walk past [[The Handler]] and you will see the item up ahead on the ledge of a building. {{Navbox/Weapons}} fc7e97560902df963b72533eeb4163cb50d05910 Regal Radiance 0 1003 1677 2025-09-13T16:13:23Z Sharparam 284703 Created page with "{{Infobox/Ability | image = Regal Radiance (ability).png | Description = Increase your [[strength]] and [[constitution]] attribute based on your [[Intelligence]] Attribute for {{Duration|s=30|display=30 seconds}}. Blinds all nearby enemies, if enemy resist, instead daze them, reducing their attack power by 20%. | Cooldown = 60 | Cost = 150 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}" wikitext text/x-wiki {{Infobox/Ability | image = Regal Radiance (ability).png | Description = Increase your [[strength]] and [[constitution]] attribute based on your [[Intelligence]] Attribute for {{Duration|s=30|display=30 seconds}}. Blinds all nearby enemies, if enemy resist, instead daze them, reducing their attack power by 20%. | Cooldown = 60 | Cost = 150 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} 6a70f92d33cb0f33867d0b6a7aafb1966eeb7ba0 File:Regal Radiance (ability).png 6 1004 1678 2025-09-13T16:13:59Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_RegalRadiance }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_RegalRadiance }} == Licensing == {{License|game}} 8fd49abc02f7cbc260df7d3db0b6783e85eb9a26 Template:Navbox/Abilities 10 578 1679 1585 2025-09-13T16:14:29Z Sharparam 284703 Add [[Regal Radiance]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Blade Dash]] * [[Bone Barrier]] * [[Divine Blessing]] * [[Marrow (ability)|Marrow]] * [[Regal Radiance]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> 6c71069be86888cd70026fcbb301f932195e426a 1681 1679 2025-09-13T16:17:02Z Sharparam 284703 Add [[Blade Dance]] wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Blade Dance]] * [[Blade Dash]] * [[Bone Barrier]] * [[Divine Blessing]] * [[Marrow (ability)|Marrow]] * [[Regal Radiance]] * [[Whirlwind Strike]] }}<noinclude>{{Documentation}}</noinclude> 843b9adc8b38c5ad373ab1a65db53deee0f2adbf 1683 1681 2025-09-13T16:25:54Z Sharparam 284703 Add missing abilities wikitext text/x-wiki {{Navbox | {{{1|}}} | template = Navbox/Abilities | title = [[Abilities]] | list1 = * [[Aberrant Strike]] * [[Arrow Brutality]] * [[Arrow Twister]] * [[Berserking Leap]] * [[Blade Dance]] * [[Blade Dash]] * [[Blade Flurry]] * [[Bladestorm]] * [[Bone Barrier]] * [[Carnage]] * [[Charged Arrow]] * [[Claymore Swing]] * [[Crescent Slash]] * [[Divine Blessing]] * [[Downward Slash]] * [[Dual Brutality]] * [[Energy Burst]] * [[Escape Velocity]] * [[Expose Armor]] * [[Forceful Repulsion]] * [[Guillotine]] * [[Heavy Strike]] * [[Improvised Fortification]] * [[Marrow (ability)|Marrow]] * [[Mending Light]] * [[Phase]] * [[Pierce]] * [[Premeditated Strike]] * [[Quake]] * [[Reanimate Dead]] * [[Reap]] * [[Refraction]] * [[Regal Radiance]] * [[Second Breath]] * [[Shadowstep]] * [[Shield Bash]] * [[Silencing Reap]] * [[Soul Storm]] * [[Sword Strike]] * [[Syphon Life]] * [[Tornado]] * [[Traitorous Leap]] * [[Whiplash]] * [[Whirlwind]] * [[Whirlwind Strike]] * [[Wind Blade]] }}<noinclude>{{Documentation}}</noinclude> 7743f44a6560ec8baecdd2abc07d4eed7a43c661 Blade Dance 0 1005 1680 2025-09-13T16:16:42Z Sharparam 284703 Created page with "{{Infobox/Ability | image = Blade Dance (ability).png | Description = Swing your weapon several times, dealing damage to all enemies in frontal cone. 46 damage and additional 34 from [[Agility]] attribute per instance of damage for a total of 320 [[Sharp]] damage. | Cooldown = 18 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}}" wikitext text/x-wiki {{Infobox/Ability | image = Blade Dance (ability).png | Description = Swing your weapon several times, dealing damage to all enemies in frontal cone. 46 damage and additional 34 from [[Agility]] attribute per instance of damage for a total of 320 [[Sharp]] damage. | Cooldown = 18 | Cost = 60 }} '''{{PAGENAME}}''' is an [[Abilities|ability]] in {{BFF}}. {{Navbox/Abilities}} b9e47fd084810728c09921e9039f38b023d02462 File:Blade Dance (ability).png 6 1006 1682 2025-09-13T16:18:01Z Sharparam 284703 {{Game image | path = Game/Textures/AbilityIcons/New/Icon_TwinbladeFlurry2 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/AbilityIcons/New/Icon_TwinbladeFlurry2 }} == Licensing == {{License|game}} aff4e6fb3a86ce71e79575d3450ddae5555e377f Passives 0 886 1685 1432 2025-09-13T16:34:42Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Passives''' are special properties that can be found on various [[equipment]], they provide their bonus at all times and don't need to be activated, unlike [[abilities]]. == See also == * [[Abilities]] {{Navbox/Passives}} [[Category:Passives]] 20da8d383a1a67a9db37a1603312b2f1eb8a7800 Ability 0 1007 1686 2025-09-13T16:35:00Z Sharparam 284703 Redirected page to [[Abilities]] wikitext text/x-wiki #REDIRECT [[Abilities]] 11b6e51c8d49cd0ea95849da924e56675f48c49b Passive 0 1008 1687 2025-09-13T16:35:13Z Sharparam 284703 Redirected page to [[Passives]] wikitext text/x-wiki #REDIRECT [[Passives]] d0f8c1c729acc790d0ebe9dca573662760756eb4 Template:Infobox/Cape 10 462 1688 689 2025-09-13T16:38:20Z Sharparam 284703 Add default for title wikitext text/x-wiki <includeonly>{{#invoke:Infobox|main |kind=cape |sep=, |title={{{title|{{PAGENAME}}}}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Effects |Effects=Effect1,Effect2,Effect3 |Effect1_nolabel=yes |Effect2_nolabel=yes |Effect3_nolabel=yes }}{{#if:{{NAMESPACE}}||[[Category:Capes]]}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> a7caaf53d894f4f0410b98360c79c94d99cc433a Ronin Scarf 0 1009 1689 2025-09-13T16:39:06Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Ronin Scarf (cape).png | Effect1 = +3 [[Agility]] | Effect2 = +10% [[Sharp]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Ronin Scarf (cape).png | Effect1 = +3 [[Agility]] | Effect2 = +10% [[Sharp]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} be26961bc7cb776bedc130e4404d8983e8d97c70 File:Ronin Scarf (cape).png 6 1010 1690 2025-09-13T16:40:11Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_scarfRonin }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_scarfRonin }} == Licensing == {{License|game}} c83167cebd43afe4d282ca41d65d242063c48d2e Agile Cape 0 1011 1691 2025-09-13T16:41:11Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Agile Cape (cape).png | Effect1 = +5 [[Agility]] | Effect2 = +50 [[Stamina]] Recovery per second }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Agile Cape (cape).png | Effect1 = +5 [[Agility]] | Effect2 = +50 [[Stamina]] Recovery per second }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} a08fbf207300cc2e840099f00d85ba359d4e87af File:Agile Cape (cape).png 6 1012 1692 2025-09-13T16:41:47Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered1 }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered1 }} == Licensing == {{License|game}} 11d16186a03e4be636e284c73fc4bfd1a27462ce Fur Cape 0 1013 1693 2025-09-13T16:42:46Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Fur Cape (cape).png | Effect1 = +0.5 Delay Before [[Stamina]] Regenerates | Effect2 = +10% Attack Power }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Fur Cape (cape).png | Effect1 = +0.5 Delay Before [[Stamina]] Regenerates | Effect2 = +10% Attack Power }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} a1607a358e9484587d35f0299d8c081980c56904 File:Fur Cape (cape).png 6 1014 1694 2025-09-13T16:43:35Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_FurCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_FurCape }} == Licensing == {{License|game}} 811f167e0433346ca8fb012e184597107ae7d145 Sentinel Overcoat 0 1015 1695 2025-09-13T16:44:30Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Sentinel Overcoat (cape).png | Effect1 = +3 [[Strength]] | Effect2 = +10% [[Blunt]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Sentinel Overcoat (cape).png | Effect1 = +3 [[Strength]] | Effect2 = +10% [[Blunt]] Armor Penetration }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} 199c56d814670c0fbe1f3e2d0642287c82c80d4d File:Sentinel Overcoat (cape).png 6 1016 1696 2025-09-13T16:45:02Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_sentinelovercoat }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_sentinelovercoat }} == Licensing == {{License|game}} 0932316b595ae1efd59c9f007169e6ac50d8daff Spectre Scarf 0 1017 1697 2025-09-13T16:45:55Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Spectre Scarf (cape).png | Effect1 = +3 [[Intelligence]] | Effect2 = +15% Critical Damage }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}]" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Spectre Scarf (cape).png | Effect1 = +3 [[Intelligence]] | Effect2 = +15% Critical Damage }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}] 9797c65e9bf878df983e20f5e442f40884e0835e 1699 1697 2025-09-13T16:46:37Z Sharparam 284703 Fix typo wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Spectre Scarf (cape).png | Effect1 = +3 [[Intelligence]] | Effect2 = +15% Critical Damage }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} 075c4bc242502504ec881a12e5b0a52078c321ad File:Spectre Scarf (cape).png 6 1018 1698 2025-09-13T16:46:21Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_scarf }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/icon_scarf }} == Licensing == {{License|game}} 7ba44884538c21cd17d556d30a9fd1bae170526f Tattered Cape 0 1019 1700 2025-09-13T16:47:13Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Tattered Cape (cape).png | Effect1 = +10% Stagger Resistance }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Tattered Cape (cape).png | Effect1 = +10% Stagger Resistance }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} 138e3008b085e2d91284c59f670f4c710d144b84 File:Tattered Cape (cape).png 6 1020 1701 2025-09-13T16:47:41Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_CapeTattered }} == Licensing == {{License|game}} 99da13814cf5bfe0dc6471904e1e113f03e2b0d1 Traveler Cape 0 1021 1702 2025-09-13T16:48:33Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Cape | image = Traveler Cape (cape).png | Effect1 = +5% Movement Speed }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Cape | image = Traveler Cape (cape).png | Effect1 = +5% Movement Speed }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}}. {{Navbox/Capes}} 48084c9c227f7d891aa4cb8edc6643e5ff9a22e6 File:Traveler Cape (cape).png 6 1022 1703 2025-09-13T16:49:02Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_TravellerCape }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Armors/Icon_TravellerCape }} == Licensing == {{License|game}} 01c9490a3332e5a3175d0b99815a37b6d96fb60b Longbow 0 1023 1704 2025-09-13T16:51:08Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Longbow (weapon).png | Type = longbow | Speed = Fast | Damage type = Sharp | Passives = Spare Shot | Abilities = Premeditated Strike | Mk_min = 1 | Mk1_Damage_min = 145 | Mk1_Damage_max = 155 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Longbow (weapon).png | Type = longbow | Speed = Fast | Damage type = Sharp | Passives = Spare Shot | Abilities = Premeditated Strike | Mk_min = 1 | Mk1_Damage_min = 145 | Mk1_Damage_max = 155 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}} 650e2dbd8c8d5da68426169d9e71336daa702bb8 File:Longbow (weapon).png 6 1024 1705 2025-09-13T16:51:42Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_BasicBow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_BasicBow }} == Licensing == {{License|game}} 2988bf44fb365b498c50de80e13a48feeebd3e5c Ranged weapons 0 659 1706 1019 2025-09-13T16:52:43Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Ranged weapons''' in {{BFF}} can be used to attack enemies at range, without having to get into melee distance. == Overview == There are two types of ranged weapons, [[longbows]] and [[staves]]. {{Navbox/Ranged weapons}} [[Category:Ranged weapons]] c9e05fc876b4500dc0a2598e6ae96b70b68fd109 Longbows 0 660 1707 1020 2025-09-13T16:53:03Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Longbows''' are a type of [[Ranged weapons|ranged weapon]] in {{BFF}}. They are currently the only type of bow available. {{Navbox/Longbows}} [[Category:Longbows]] cd170e9044aba6f6d9fb1c8f967eddfc03c2e83e Template:Navbox/Longbows 10 818 1708 1270 2025-09-13T16:53:18Z Sharparam 284703 Fix name for winged bow wikitext text/x-wiki {{Navbox | {{{1|}}} | state = {{{state|}}} | template = Navbox/Longbows | title = [[Longbows]] | list1 = * [[Arcane Bow]] * [[Longbow]] * [[Taskmaster]] * [[Winged Bow]] }}<noinclude>{{Documentation}}</noinclude> 92e2d941a1e3293271ed058e50202e0d473ec836 Winged Bow 0 1025 1709 2025-09-13T16:54:24Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Winged Bow (weapon).png | Type = Longbow | Speed = Fast | Damage type = Sharp | Abilities = Arrow Brutality, Charged Arrow | Mk3_Damage_min = 194 | Mk3_Damage_max = 207 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Winged Bow (weapon).png | Type = Longbow | Speed = Fast | Damage type = Sharp | Abilities = Arrow Brutality, Charged Arrow | Mk3_Damage_min = 194 | Mk3_Damage_max = 207 }} '''{{PAGENAME}}''' is a [[Longbows|longbow]] in {{BFF}}. {{Navbox/Weapons}} 2af5559ce19030294ae8ce010a93a8eb402991cc File:Winged Bow (weapon).png 6 1026 1710 2025-09-13T16:54:47Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_wingedbow }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/icon_wingedbow }} == Licensing == {{License|game}} b5879184f94de6dcfe2bbc51e0272a761578db3a Evolved Staff 0 1027 1711 2025-09-13T16:56:15Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Evolved Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Evolved Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}} 1210043d143c13c1eba3e2572c7728d2d3705198 File:Evolved Staff (weapon).png 6 1028 1712 2025-09-13T16:56:43Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_EvolvedStaffNew }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_EvolvedStaffNew }} == Licensing == {{License|game}} 9c4d3c85a9d54e936188036425bb5e844ae5eb27 Mechanomad Staff 0 1029 1713 2025-09-13T16:57:45Z Sharparam 284703 Created page with "{{Needs location}} {{Infobox/Weapon | image = Mechanomad Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}}" wikitext text/x-wiki {{Needs location}} {{Infobox/Weapon | image = Mechanomad Staff (weapon).png | Type = Staff | Speed = Slow | Damage type = Technomancy | Mk0_Damage_min = 49 | Mk0_Damage_max = 50 }} '''{{PAGENAME}}''' is a [[Staves|staff]] in {{BFF}}. {{Navbox/Weapons}} abc6b834084e76b5d3cc23245bd05ff84360c6db File:Mechanomad Staff (weapon).png 6 1030 1714 2025-09-13T16:58:10Z Sharparam 284703 {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_MechanomadStaff. }} wikitext text/x-wiki == Summary == {{Game image | path = Game/Textures/EquipmentIcons/New/Weapons/Icon_MechanomadStaff. }} == Licensing == {{License|game}} 4f8863c9a8d014e23902360f4115eae1e6d0a2d4 Anomalous crystals 0 427 1715 617 2025-09-13T17:01:15Z Sharparam 284703 Add note on extraction wikitext text/x-wiki '''{{PAGENAME}}''' are [[items]] that can be embedded into [[equipment]] ([[armor]] or [[weapons]] only) to improve their properties. == Overview == There are three "tiers" of crystals: '''[[Lesser Anomalous Crystal|lesser]]''', '''[[Anomalous Crystal|normal]]''', and '''[[Greater Anomalous Crystal|greater]]'''. Crystals can only be embedded into equipment by [[The Handler]]. Embedding a crystal into a slot destroys any crystal that is already occupying said slot, causing it to be lost forever. Unwanted crystals can be destroyed by extracting essence from them in the inventory, one crystal (regardless of tier) grants one essence when extracted. {{Navbox/Items}} [[Category:Anomalous crystals]] d2a2bb73ae64ca30747d98ab5cfef8721182b0b2 Ammunition 0 814 1716 1264 2025-09-13T17:01:55Z Sharparam 284703 Fix typo wikitext text/x-wiki '''{{PAGENAME}}''' are items that can be shot with [[longbows]]. {{Navbox/Ammunition}} [[Category:Ammunition]] cc83a8d360dcc7f109694ab4c21f0ae311b310bb Upgrade items 0 662 1717 1022 2025-09-13T17:02:42Z Sharparam 284703 Move equipment link wikitext text/x-wiki '''Upgrade items''' in {{BFF}} can be used to upgrade [[equipment]] to higher mark levels. == Overview == There are two upgrade items available. === Upgrade Splinter === {{Main|Upgrade Splinter}} Upgrade splinters are used to upgrade equipment to Mk 1, 2, and 3. === Upgrade Modules === {{Main|Upgrade Module}} Upgrade modules are used to upgrade equipment to Mk 4 and 5. [[Category:Upgrade items]] 6c65a41a767ff088faff06fa3c60df4e40e5d288 1718 1717 2025-09-13T17:03:10Z Sharparam 284703 Add navbox wikitext text/x-wiki '''Upgrade items''' in {{BFF}} can be used to upgrade [[equipment]] to higher mark levels. == Overview == There are two upgrade items available. === Upgrade Splinter === {{Main|Upgrade Splinter}} Upgrade splinters are used to upgrade equipment to Mk 1, 2, and 3. === Upgrade Modules === {{Main|Upgrade Module}} Upgrade modules are used to upgrade equipment to Mk 4 and 5. {{Navbox/Essential items}} [[Category:Upgrade items]] 3fa4114361dde368f8d5149cfa5e5186640ac550 Essential items 0 665 1719 1026 2025-09-13T17:04:05Z Sharparam 284703 Add description wikitext text/x-wiki '''Essential items''' are important [[items]] in the game, either for progression or upgrading [[equipment]]. {{Navbox/Essential items}} [[Category:Essential items]] e4ce9ed78441611f20c3c1fffdf6ceb7ff482a4f Template:BFF 10 346 1720 459 2025-09-13T17:04:59Z Sharparam 284703 Protected "[[Template:BFF]]": Widely transcluded ([Edit=Allow only administrators] (indefinite) [Rename=Allow only administrators] (indefinite)) wikitext text/x-wiki ''[[Bleak Faith: Forsaken]]'' a07fd38648935c2ecd381aa47db3694dae3fb873 1721 1720 2025-09-13T17:05:44Z Sharparam 284703 Add documentation wikitext text/x-wiki ''[[Bleak Faith: Forsaken]]''<noinclude>{{Documentation}}</noinclude> 37316fd90539b5b11f099a0497c71388ccc8a405 Template:BFF/doc 10 1031 1722 2025-09-13T17:07:21Z Sharparam 284703 Created page with "Used to produce a link to the game's article, with proper formatting. == TemplateData == <templatedata> { "params": {}, "description": "Used to produce a link to the game's article, with proper formatting.", "format": "inline" } </templatedata> == Example == * <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> &rarr; {{BFF}} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noi..." wikitext text/x-wiki Used to produce a link to the game's article, with proper formatting. == TemplateData == <templatedata> { "params": {}, "description": "Used to produce a link to the game's article, with proper formatting.", "format": "inline" } </templatedata> == Example == * <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> &rarr; {{BFF}} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> f6195706a649006c85d6c9c2c81995d9b2ce4314 1723 1722 2025-09-13T17:10:08Z Sharparam 284703 Update categorization wikitext text/x-wiki Used to produce a link to the game's article, with proper formatting. == TemplateData == <templatedata> { "params": {}, "description": "Used to produce a link to the game's article, with proper formatting.", "format": "inline" } </templatedata> == Example == * <syntaxhighlight lang="wikitext" inline>{{BFF}}</syntaxhighlight> &rarr; {{BFF}} <includeonly>[[Category:Templates]]</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> 260a69a9c0b54df8f57bd374581c9def8835d210 Deluge 0 356 1724 1509 2025-09-13T17:15:48Z Sharparam 284703 Add enemy list wikitext text/x-wiki [[File:Deluge.png|thumb|Deluge as depicted in the game's relocation menu.|alt=Artwork showing the Deluge area filled with water with structures lining the sides.]] '''{{PAGENAME}}''' is a location in {{BFF}}. {{Quote | A vast reservoir stretches out like a somber mirror, its surface eerily still, broken only by the faintest ripples. Shadowy shapes drift beneath the dark water, their forms indistinct and haunting. }} == NPCs == * [[The Handler]] == Enemies == * [[Fisherman]] {{Navbox/Locations}} [[Category:Locations]] 8bcb7f6fd26e25cf5edd2c9c098ffc8f66e968ef Archinquisitor Belisarius 0 401 1725 564 2025-09-13T17:23:38Z Sharparam 284703 Update image name wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}} {{stub}} {{Infobox/NPC | image = Archinquisitor Belisarius (NPC).png }} {{Navbox/NPCs}} 37acab4f9f5d248cfaf4cbfd488ab7b9eb7e8d17 1727 1725 2025-09-13T17:30:22Z Sharparam 284703 Add more information wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}} {{Infobox/NPC | image = Archinquisitor Belisarius (NPC).png }} == Location == {{coords|3470.22|23631.83|-20680.39}} Located in the [[Machinarium]], inside a small temple leading to a cave. The entrance is in the forest area after defeating [[Aberrant Knight]]. == Quotes == === On first encounter === {{Quote |I emphathize with those we purify… But when I lay my hands on [[the Serdars]]… Hell will seem like Heaven! If we could only do away with everything here, altogether… A marvellous conception, a supreme figure, an exalted shadow, an infinite representation of the excellence and supremacy that transcends comprehension or grasp. Thus is the excellence of the [[God-Emperor]] and the greatness of his domains made manifest. He will be glorified not in one, but in countless suns. Not in a single realm but in a thousand! I do not like forced conversations, so – if you please… There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight. }} === On subsequent encounters === {{Quote|There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.}} {{Navbox/NPCs}} b3208bc5094affe5c8dc01a8d3b218ad475f101a 1728 1727 2025-09-13T17:31:50Z Sharparam 284703 Add introduction wikitext text/x-wiki {{About|the [[NPC]]|the [[Bosses|boss]]|Archinquisitor Belisarius (boss)}} {{Infobox/NPC | image = Archinquisitor Belisarius (NPC).png }} '''Archinquisitor Belisarius''' is an [[NPCs|NPC]] in {{BFF}}. The player will later encounter him as a [[Bosses|boss]] near the end of the game. == Location == {{coords|3470.22|23631.83|-20680.39}} Located in the [[Machinarium]], inside a small temple leading to a cave. The entrance is in the forest area after defeating [[Aberrant Knight]]. == Quotes == === On first encounter === {{Quote |I emphathize with those we purify… But when I lay my hands on [[the Serdars]]… Hell will seem like Heaven! If we could only do away with everything here, altogether… A marvellous conception, a supreme figure, an exalted shadow, an infinite representation of the excellence and supremacy that transcends comprehension or grasp. Thus is the excellence of the [[God-Emperor]] and the greatness of his domains made manifest. He will be glorified not in one, but in countless suns. Not in a single realm but in a thousand! I do not like forced conversations, so – if you please… There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight. }} === On subsequent encounters === {{Quote|There is no meaning to an existence with no beginning and no end, and I no longer wish to indulge it with conversation. Out of my sight.}} {{Navbox/NPCs}} a68805c0d737cc497b94917641f7c31fcd301908 File:Archinquisitor Belisarius (NPC).png 6 1032 1726 2025-09-13T17:23:58Z Sharparam 284703 wikitext text/x-wiki == Licensing == {{License|fairuse}} 87d7977e3529dee7284946acd854ac7b16cf2467 Module:Recipe/doc 828 917 1729 1526 2025-09-13T17:35:10Z Sharparam 284703 Use valid results and ingredients wikitext text/x-wiki This module should not be used directly, instead use it via the {{tl|Recipe}} template. == Styles == * [[Module:Recipe/styles.css]] == Test cases == === Simple single ingredient recipe === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Restorative Fluid |ingredient = Gingko Leaves }} </syntaxhighlight> {{#invoke:Recipe|main |result = Restorative Fluid |ingredient = Gingko Leaves }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{#invoke:Recipe|main |result = Greater Restorative Fluid |ingredient1 = Sludge |ingredient2 = Gingko Leaves }} </syntaxhighlight> {{#invoke:Recipe|main |result = Greater Restorative Fluid |ingredient1 = Sludge |ingredient2 = Gingko Leaves }} <includeonly>{{Sandbox other||[[Category:Modules]]}}</includeonly><!-- --><noinclude>[[Category:Module documentation pages]]</noinclude> 88e2030ec6ad85bf856aa6f36b49911ced32abbd Template:Recipe/doc 10 920 1730 1530 2025-09-13T17:36:40Z Sharparam 284703 Use valid items in examples wikitext text/x-wiki == Examples == === Simple recipe with single ingredient === <syntaxhighlight lang="wikitext"> {{Recipe | result = Restorative Fluid | ingredient = Gingko Leaves }} </syntaxhighlight> {{Recipe | result = Restorative Fluid | ingredient = Gingko Leaves }} === Multiple ingredients === <syntaxhighlight lang="wikitext"> {{Recipe | result = Greater Restorative Fluid | ingredient1 = Sludge | ingredient2 = Gingko Leaves }} </syntaxhighlight> {{Recipe | result = Greater Restorative Fluid | ingredient1 = Sludge | ingredient2 = Gingko Leaves }} === Manufacturing recipe === <syntaxhighlight lang="wikitext"> {{Recipe | result = Mystery Concoction | ingredient = Sludge | type = manufacturing }} </syntaxhighlight> {{Recipe | result = Mystery Concoction | ingredient = Sludge | type = manufacturing }} === Quantities === <syntaxhighlight lang="wikitext"> {{Recipe | result = Metal Arrows | result_quantity = 10 | ingredient1 = Machinite | ingredient1_quantity = 5 | ingredient2 = Sludge | ingredient2_quantity = 2 | ingredient3 = Gingko Leaves | ingredient3_quantity = 10 | type = crafting }} </syntaxhighlight> {{Recipe | result = Metal Arrows | result_quantity = 10 | ingredient1 = Machinite | ingredient1_quantity = 5 | ingredient2 = Sludge | ingredient2_quantity = 2 | ingredient3 = Gingko Leaves | ingredient3_quantity = 10 | type = crafting }} <includeonly>{{Sandbox other||[[Category:Templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> d152f85b96c4ccf5584d304936e74be664106ea1 Techpriest Cape 0 515 1731 1033 2025-09-13T17:39:36Z Sharparam 284703 Fix interwiki link wikitext text/x-wiki {{Infobox/Cape | image = Techpriest Cape.png | title = {{PAGENAME}} | Effect1 = +50 Max [[flux]] points. | Effect2 = +150 [[Flux]] leech rating. }} '''{{PAGENAME}}''' is a [[Capes|cape]] in {{BFF}} that can be worn by the player. == Location == {{coords|-4527|8973|9614}} Found in [[Asylum]]. After entering the first courtyard, climb the stairs on the right and jump onto the right ledge, then follow it backwards (towards the direction you entered from) and the item will be on a corpse on the left. == Trivia == * "Techpriest" in the name might be a reference to [https://wh40k.lexicanum.com/wiki/Tech-priest tech-priests] from [[wikipedia:Warhammer 40,000|Warhammer 40,000]]. * The cape is called "HighPriestCape" in the game files. {{Navbox/Capes}} dc3568f0be90eee43efeafc7d9ad950530eaef8b Greatweapon 0 1033 1732 2025-09-13T17:40:36Z Sharparam 284703 Redirected page to [[Greatweapons]] wikitext text/x-wiki #REDIRECT [[Greatweapons]] 1e761b4aa7eac6f5415739067c330950b195d7f0 Staff 0 1034 1733 2025-09-13T17:40:49Z Sharparam 284703 Redirected page to [[Staves]] wikitext text/x-wiki #REDIRECT [[Staves]] 695e27b9fb3bc2aedd279a23c2ed933b3df0478b Two-handed 0 1035 1734 2025-09-13T17:41:10Z Sharparam 284703 Redirected page to [[Two-handed weapons]] wikitext text/x-wiki #REDIRECT [[Two-handed weapons]] 26b71e9dcde020e910bf0237e4781f8038ef353e One-handed 0 1036 1735 2025-09-13T17:41:23Z Sharparam 284703 Redirected page to [[One-handed weapons]] wikitext text/x-wiki #REDIRECT [[One-handed weapons]] 72c8194c2cd8818bb06c5f772d5f0501cc48e935 Template:Infobox/Weapon 10 451 1736 1661 2025-09-13T17:42:48Z Sharparam 284703 Fix name resolution wikitext text/x-wiki <includeonly>{{#vardefine:name|{{{title|{{PAGENAME}}}}}}}{{#invoke:Infobox|main |kind=weapon |sep=, |title={{#var:name}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | template = Passive link item | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link item | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | greatweapon = [[Greatweapons|Greatweapon]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | greatweapon = [[Category:Greatweapons]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{#var:name}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | greatweapon = greatweapon | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> 648952ec0a0f6a575c636d80aa897ba29a8dfc1a 1742 1736 2025-09-13T17:52:00Z Sharparam 284703 Use damage type template wikitext text/x-wiki <includeonly>{{#vardefine:name|{{{title|{{PAGENAME}}}}}}}{{#invoke:Infobox|main |kind=weapon |sep=, |title={{#var:name}} |image={{#if:{{{image|}}}|[[File:{{{image}}}{{!}}300px]]}} |sections=Basic Info, Stats |Basic Info=Type,Speed,Damage type,Passives,Abilities |Passives={{#listmap: | list = {{{Passives|}}} | outsep = \n | token = @@@@ | template = Passive link item | intro = \{\{Plainlist\! | outro = \}\} }} |Passives_label={{#ifeq:{{#lstcnt:{{{Passives|}}}}}|1|Passive|Passives}} |Abilities={{#listmap: | list = {{{Abilities|}}} | outsep = \n | token = @@@@ | template = Ability link item | intro = \{\{Plainlist\! | outro = \}\} }} |Abilities_label={{#ifeq:{{#lstcnt:{{{Abilities|}}}}}|1|Ability|Abilities}} |Type={{#if:{{{Type|}}}|{{#switch:{{lc:{{{Type}}}}} | one-handed = [[One-handed weapons|One-handed]] | two-handed = [[Two-handed weapons|Two-handed]] | dual wield = [[Dual Wield]] | twinblade = [[Twinblades|Twinblade]] | greatweapon = [[Greatweapons|Greatweapon]] | bow | longbow = [[Longbows|Longbow]] | ranged = [[Ranged weapons|Ranged]] | staff = [[Staves|Staff]] | #default = {{{Type}}} }}}} |Damage type={{#if:{{{Damage type|}}}|{{Damage type|{{{Damage type}}}}}}} |tabs={{#switch:{{{Mk_min|0}}} |1 = Mk1,Mk2,Mk3,Mk4,Mk5 |2 = Mk2,Mk3,Mk4,Mk5 |3 = Mk3,Mk4,Mk5 |4 = Mk4,Mk5 |5 = Mk5 |#default = Mk0,Mk1,Mk2,Mk3,Mk4,Mk5 }} |Mk0_label=Mk 0 |Mk1_label=Mk 1 |Mk2_label=Mk 2 |Mk3_label=Mk 3 |Mk4_label=Mk 4 |Mk5_label=Mk 5 |Stats=Damage |Mk0_Damage={{DamageRange|{{{Mk0_Damage_min|???}}}|{{{Mk0_Damage_max|???}}}}} |Mk1_Damage={{DamageRange|{{{Mk1_Damage_min|???}}}|{{{Mk1_Damage_max|???}}}}} |Mk2_Damage={{DamageRange|{{{Mk2_Damage_min|???}}}|{{{Mk2_Damage_max|???}}}}} |Mk3_Damage={{DamageRange|{{{Mk3_Damage_min|???}}}|{{{Mk3_Damage_max|???}}}}} |Mk4_Damage={{DamageRange|{{{Mk4_Damage_min|???}}}|{{{Mk4_Damage_max|???}}}}} |Mk5_Damage={{DamageRange|{{{Mk5_Damage_min|???}}}|{{{Mk5_Damage_max|???}}}}} }}{{#if:{{NAMESPACE}}||{{#switch:{{lc:{{{Type|}}}}} | one-handed = [[Category:One-handed weapons]] | two-handed = [[Category:Two-handed weapons]] | dual wield = [[Category:Dual Wields]] | twinblade = [[Category:Twinblades]] | greatweapon = [[Category:Greatweapons]] | bow | longbow = [[Category:Longbows]] | ranged = [[Category:Ranged weapons]] | staff = [[Category:Staves]] | #default = [[Category:Weapons]] }}{{Weapons/CargoStore |name={{#var:name}} |type={{#switch:{{lc:{{{Type}}}}} | one-handed = one-handed | two-handed = two-handed | dual wield = dual wield | twinblade = twinblade | greatweapon = greatweapon | bow | longbow = longbow | ranged = ranged | staff = staff | #default = unknown }} |speed={{#if:{{{Speed|}}}|{{lc:{{{Speed}}}}}}} |damageType={{#if:{{{Damage type|}}}|{{#switch:{{lc:{{{Damage type}}}}} | sharp = sharp | blunt = blunt | tech | technomancy = technomancy }}}} |damageMk0Min={{{Mk0_Damage_min|}}} |damageMk0Max={{{Mk0_Damage_max|}}} |damageMk1Min={{{Mk1_Damage_min|}}} |damageMk1Max={{{Mk1_Damage_max|}}} |damageMk2Min={{{Mk2_Damage_min|}}} |damageMk2Max={{{Mk2_Damage_max|}}} |damageMk3Min={{{Mk3_Damage_min|}}} |damageMk3Max={{{Mk3_Damage_max|}}} |damageMk4Min={{{Mk4_Damage_min|}}} |damageMk4Max={{{Mk4_Damage_max|}}} |damageMk5Min={{{Mk5_Damage_min|}}} |damageMk5Max={{{Mk5_Damage_max|}}} }}}}</includeonly><noinclude>{{Documentation}}[[Category:Infobox templates]]</noinclude> c7a1675b3627d1c2e3ea681c310cbb46b80eadd6 Blunt 0 1037 1737 2025-09-13T17:43:31Z Sharparam 284703 Created page with "'''Blunt''' is a type of damage in {{BFF}}. [[Category:Game mechanics]]" wikitext text/x-wiki '''Blunt''' is a type of damage in {{BFF}}. [[Category:Game mechanics]] 01f1c4d287033b2532357615f04edb64b5d5e46f Sharp 0 526 1738 813 2025-09-13T17:43:53Z Sharparam 284703 Add category wikitext text/x-wiki '''Sharp''' is a type of damage in {{BFF}}. [[Category:Game mechanics]] cce1ce9bc84831c31b53fbafed846e82615d4eaa Template:Damage type 10 1038 1739 2025-09-13T17:48:11Z Sharparam 284703 Created page with "{{#switch:{{lc:{{{1}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}<!-- --><noinclude>{{Documentation}}</noinclude>" wikitext text/x-wiki {{#switch:{{lc:{{{1}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{Damage type}}} }}<!-- --><noinclude>{{Documentation}}</noinclude> d6f3d0b6d394b2e121f2f614e3c29a26a1ea3429 1740 1739 2025-09-13T17:48:30Z Sharparam 284703 Fix wrong variable used wikitext text/x-wiki {{#switch:{{lc:{{{1}}}}} | sharp = [[File:Sharp_outlined.png|20px|link=Sharp]] [[Sharp]] | blunt = [[File:Blunt_outlined.png|20px|link=Blunt]] [[Blunt]] | tech | technomancy = [[File:Technomancy_outlined.png|20px|link=Technomancy]] [[Technomancy]] | #default = {{{1}}} }}<!-- --><noinclude>{{Documentation}}</noinclude> e96e740f90b54922fa87b26908a3cd35fa581e42 Template:Damage type/doc 10 1039 1741 2025-09-13T17:51:15Z Sharparam 284703 Created page with "Creates a formatted link to one of the three damage types. == TemplateData == <templatedata> { "params": { "1": { "label": "Damage type", "description": "The damage type to link to.", "example": "Sharp", "type": "line", "suggestedvalues": [ "sharp", "blunt", "technomancy" ], "required": true } }, "description": "Creates a link to a damage type, including relevant icon.", "format": "inline" } </templatedata> == Examples == * <syn..." wikitext text/x-wiki Creates a formatted link to one of the three damage types. == TemplateData == <templatedata> { "params": { "1": { "label": "Damage type", "description": "The damage type to link to.", "example": "Sharp", "type": "line", "suggestedvalues": [ "sharp", "blunt", "technomancy" ], "required": true } }, "description": "Creates a link to a damage type, including relevant icon.", "format": "inline" } </templatedata> == Examples == * <syntaxhighlight lang="wikitext" inline>{{Damage type|sharp}}</syntaxhighlight> &rarr; {{Damage type|sharp}} * <syntaxhighlight lang="wikitext" inline>{{Damage type|blunt}}</syntaxhighlight> &rarr; {{Damage type|blunt}} * <syntaxhighlight lang="wikitext" inline>{{Damage type|technomancy}}</syntaxhighlight> &rarr; {{Damage type|technomancy}} * <syntaxhighlight lang="wikitext" inline>{{Damage type|tech}}</syntaxhighlight> &rarr; {{Damage type|tech}} <includeonly>{{Sandbox other||[[Category:Formatting templates]]}}</includeonly><!-- --><noinclude>[[Category:Template documentation]]</noinclude> e257f4fab4a45f3e90e5c87bbbc11b24aa0f7939 Weapons 0 465 1743 695 2025-09-13T17:52:56Z Sharparam 284703 Use damage type template in table wikitext text/x-wiki '''{{PAGENAME}}''' are a type of [[equipment]] in {{BFF}} used to engage in melee combat with [[enemies]]. == Upgrading == Weapons can be upgraded all the way to Mk 5 by speaking to [[The Handler]] and giving her the requisite materials. Upgrading a weapon increases its damage as well as allowing you to embed more crystals into it to improve its properties further. Some weapons will also unlock passive bonuses or abilities when they are upgraded. == List of weapons == {{#cargo_query:table=Weapons |fields=CONCAT('[[', name, ']]')=Name, CONCAT('[[', type, ']]')=Type, speed=Speed, CONCAT('{{((}}Damage type{{!}}', damageType, '{{))}}')=Damage type, CONCAT("{{((}}DamageRange{{!}}", damageMk0Min, '{{!}}', damageMk0Max, '{{))}}')=Damage (Mk 0), CONCAT("{{((}}DamageRange{{!}}", damageMk1Min, '{{!}}', damageMk1Max, '{{))}}')=Damage (Mk 1), CONCAT("{{((}}DamageRange{{!}}", damageMk2Min, '{{!}}', damageMk2Max, '{{))}}')=Damage (Mk 2), CONCAT("{{((}}DamageRange{{!}}", damageMk3Min, '{{!}}', damageMk3Max, '{{))}}')=Damage (Mk 3), CONCAT("{{((}}DamageRange{{!}}", damageMk4Min, '{{!}}', damageMk4Max, '{{))}}')=Damage (Mk 4), CONCAT("{{((}}DamageRange{{!}}", damageMk5Min, '{{!}}', damageMk5Max, '{{))}}')=Damage (Mk 5) |format=table }} {{Navbox/Weapons}} c7b3076333c274bb0420ef5b86f4d35132e6dfe6